object у Kotlin-у: шта је то, синтакса и примена синглтон-објеката

Аутор: IT Sectr Објављено: 2026-06-21 Време читања: 9 мин

object у Kotlin-у — то је декларативни начин креирања синглтон-објекта са лењом иницијализацијом и подразумеваном безбедношћу нити. Кључна реч object замењује целу класу са једним инстанцом и користи се за декларисање singleton, companion object, анонимних објеката и статичких утилита. Према JetBrains Kotlin Documentation (2026), object declaration је најједноставнији и најбезбеднији начин имплементације singleton-а у JVM свету.

Главно

  • object — кључна реч за декларисање синглтон-класе са једним инстанцом
  • Лења иницијализација — object се креира при првом приступу, а не при учитавању класе
  • Companion object — аналог статичких чланова у Kotlin-у (нема static keyword)
  • Object expression — анонимни објекат за преузимање метода у лету
  • Безбедност нити — иницијализација object је гарантовано thread-safe

Шта је object у Kotlin-у?

object у Kotlin-у — то је специјална форма декларације која истовремено дефинише класу и креира њен једини инстанц (синглтон). То је хибрид class declaration и instance creation у једној конструкцији.

У Java-и за креирање singleton-а потребно је написати приватни конструктор, статичко поље, метод getInstance и обрадити безбедност нити. Kotlin object то ради једном линијом кода: object MySingleton { }. Компајлер самостално генерише безбедну лењу иницијализацију, користећи механизам static initializer у бајт-коду JVM-а.

Према Kotlin Language Specification (2026), object declaration се компајлира у финалну класу са приватним конструктором и статичким пољем INSTANCE, иницијализованим у статичком блоку. Ово гарантује атомичност иницијализације на нивоу JVM-а.

Синглтон-објекти (object declaration)

Object declaration (синглтон-објекат) се декларише помоћу кључне речи object, након које следи име. Тело објекта може садржати својства, методе, init блокове и наслеђивати друге класе или интерфејсе.

kotlin
object DatabaseManager {
    private val connection: String = "jdbc:postgresql://localhost:5432/app"
    
    fun query(sql: String): List<Map<String, Any>> {
        // извршавање упита
        return emptyList()
    }
}

// Употреба
DatabaseManager.query("SELECT * FROM users")

Иницијализација DatabaseManager-а се дешава у тренутку првог приступа — лењо и безбедно за нити. Никакав додатни код за синхронизацију није потребан.

Наслеђивање за object

Object може наслеђивати обичне класе и интерфејсе. Ово омогућава коришћење object-а као имплементације апстрактне класе или интерфејса са једним инстанцом.

kotlin
interface Logger {
    fun log(message: String)
}

object ConsoleLogger : Logger {
    override fun log(message: String) {
        println("[LOG] $message")
    }
}

Companion object

companion object — то је специјални object декларисан унутар класе са кључном речи companion. Он замењује статичке чланове у Kotlin-у, јер у језику нема кључне речи static.

kotlin
class ApiClient {
    companion object {
        private const val BASE_URL = "https://api.example.com"
        
        fun create(): ApiClient {
            return ApiClient()
        }
    }
}

// Позивање без креирања инстанце ApiClient-а
val client = ApiClient.create()

Companion object може имати име (подразумевано Companion), имплементирати интерфејсе и бити проширив кроз extension functions. За разлику од статичких метода у Java-и, companion object је пуноправни објекат који се може проследити као аргумент или сачувати у променљивој.

Према Kotlin Best Practices (2026), companion object се користи за фабричке методе, константе и статичке утилите повезане са класом. Препоручује се избегавање прекомерног коришћења companion object-а — за неповезане утилите боље је користити функције највишег нивоа.

Анотација @JvmStatic

За компатибилност са Java-ом, методи companion object-а могу се анотирати са @JvmStatic. Ово генерише праву статичку методу у бајт-коду JVM-а, доступну из Java кода без синтаксе Companion.

Object expressions (анонимни објекти)

Object expression — то је анонимни објекат креиран на месту за преузимање метода класе или интерфејса без декларисања посебне именоване класе.

kotlin
val handler = object : Runnable {
    override fun run() {
        println("Задатак извршен")
    }
}

thread(handler)

Object expressions се разликују од декларација object по томе што креирају нови инстанц при сваком извршењу. Они нису синглтони и немају име. Анонимни објекти могу хватати променљиве из затворења, као и ламбде.

За разлику од Java-е, где анонимне класе могу наслеђивати само један тип, Kotlin object expression може наслеђивати више типова истовремено.

kotlin
interface Clickable {
    fun click()
}

abstract class View {
    abstract fun render()
}

val button = object : View(), Clickable {
    override fun render() = println("Рендеровање дугмета")
    override fun click() = println("Дугме кликнуто")
}

Практични сценарији коришћења

Object — једна од најсвестранијих конструкција Kotlin-а, примењена у многим сценаријима.

Синглтон репозиторијуми

У Android пројектима object се често користи за декларисање Repository-а, где није потребно више инстанци. Јединствени инстанц гарантује конзистентност података.

kotlin
object UserRepository {
    fun getUser(id: Int): User? {
        // добијање корисника
        return null
    }
}

Фабричке методе кроз companion object

Companion object са фабричким методама — алтернатива вишеструким конструкторима. Именоване фабричке методе чине код самодокументујућим.

kotlin
data class GsonParser {
    companion object {
        fun create(): GsonParser = GsonParser()
        fun createPretty(): GsonParser = GsonParser()
    }
}

Константе и набрајања

Object може служити као контејнер за константе, замењујући статичка final поља у Java-и. Притом object подржава наслеђивање, што омогућава креирање хијерархија конфигурација.

Према Kotlin Standard Library (2026), object declaration је најучинковитији начин креирања singleton-а у Kotlin-у, превазилазећи по брзини имплементације „double-checked locking“ и упоредив са enum singleton-ом у Java-и.

Често постављана питања

По чему се object разликује од обичне класе?

Object истовремено декларише класу и креира њен једини инстанц. Обична класа може имати више инстанци креираних кроз конструктор.

Када се иницијализује object declaration?

Лењо — при првом приступу објекту. До тада меморија није алоцирана, а код у init блоку се не извршава.

Може ли object имати конструктор?

Не, object не може имати експлицитни конструктор. Иницијализација се врши у init блоку, који се позива једном при првом приступу објекту.

По чему се companion object разликује од обичног object-а?

companion object — то је object декларисан унутар класе. Његови чланови су доступни кроз име класе без креирања инстанца, што замењује статичке чланове Java-е.

Да ли су object declarations безбедни у вишенитном окружењу?

Да, иницијализација object-а је потпуно безбедна за нити захваљујући статичком иницијализатору JVM-а. Никаква додатна синхронизација није потребна.

Закључак

  • object — декларативни синглтон са лењом и безбедном иницијализацијом
  • companion object — статички чланови у Kotlin-у, фабричке методе, константе
  • Object expression — анонимни објекти на месту са хватањем променљивих из затворења
  • Наслеђивање — object може наслеђивати класе и интерфејсе, укључујући више типова
  • Перформансе — иницијализација кроз static initializer JVM-а, без overhead double-checked locking-а
  • Примена — singleton сервиси, репозиторијуми, константе, фабрике, listener адаптери
  • Ограничења — нема експлицитног конструктора, један инстанц на цео JVM

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође