object în Kotlin: ce este, sintaxa și aplicarea obiectelor singleton

Autor: IT Sectr Publicat: 2026-06-21 Timp de citire: 9 min

object în Kotlin — este un mod declarativ de a crea un obiect singleton cu inițializare leneșă și siguranță la fire de execuție implicită. Cuvântul cheie object înlocuiește o întreagă clasă cu o singură instanță și este folosit pentru a declara singleton, companion object, obiecte anonime și utilitare statice. Conform JetBrains Kotlin Documentation (2026), object declaration este cel mai simplu și sigur mod de a implementa un singleton în lumea JVM.

Principalele

  • object — cuvânt cheie pentru declararea unei clase singleton cu o singură instanță
  • Inițializare leneșă — object se creează la prima accesare, nu la încărcarea clasei
  • Companion object — analogul membrilor statici în Kotlin (nu există static keyword)
  • Object expression — obiect anonim pentru suprascrierea metodelor pe loc
  • Siguranța firelor — inițializarea object este garantat thread-safe

Ce este object în Kotlin?

object în Kotlin — este o formă specială de declarație care definește simultan o clasă și creează singura sa instanță (singleton). Este un hibrid între class declaration și instance creation într-o singură construcție.

În Java pentru a crea un singleton trebuie să scrieți un constructor privat, un câmp static, o metodă getInstance și să gestionați siguranța firelor. Kotlin object face acest lucru cu o singură linie de cod: object MySingleton { }. Compilatorul generează automat inițializarea leneșă thread-safe folosind mecanismul static initializer în bytecode-ul JVM.

Conform Kotlin Language Specification (2026), object declaration se compilează într-o clasă finală cu constructor privat și câmp static INSTANCE, inițializat într-un bloc static. Aceasta garantează atomicitatea inițializării la nivelul JVM.

Obiecte singleton (object declaration)

Object declaration (obiect singleton) se declară folosind cuvântul cheie object, urmat de nume. Corpul obiectului poate conține proprietăți, metode, blocuri init și poate moșteni alte clase sau interfețe.

kotlin
object DatabaseManager {
    private val connection: String = "jdbc:postgresql://localhost:5432/app"
    
    fun query(sql: String): List<Map<String, Any>> {
        // executarea interogării
        return emptyList()
    }
}

// Utilizare
DatabaseManager.query("SELECT * FROM users")

Inițializarea DatabaseManager are loc în momentul primei accesări — leneș și thread-safe. Nu este necesar niciun cod suplimentar pentru sincronizare.

Moștenirea pentru object

Object poate moșteni clase obișnuite și interfețe. Acest lucru permite utilizarea object ca implementare a unei clase abstracte sau a unei interfețe cu o singură instanță.

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

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

Companion object

companion object — este un object special declarat în interiorul unei clase cu cuvântul cheie companion. Acesta înlocuiește membrii statici în Kotlin, deoarece în limbă nu există cuvântul cheie static.

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

// Apel fără a crea o instanță ApiClient
val client = ApiClient.create()

Companion object poate avea un nume (implicit Companion), poate implementa interfețe și poate fi extins prin extension functions. Spre deosebire de metodele statice din Java, companion object este un obiect complet, care poate fi transmis ca argument sau stocat într-o variabilă.

Conform Kotlin Best Practices (2026), companion object este folosit pentru metode fabrică, constante și utilitare statice asociate clasei. Se recomandă evitarea utilizării excesive a companion object — pentru utilitare neasociate este mai bine să folosiți funcții de nivel superior.

Adnotarea @JvmStatic

Pentru compatibilitatea cu Java, metodele companion object pot fi adnotate cu @JvmStatic. Acest lucru generează o metodă statică reală în bytecode-ul JVM, accesibilă din codul Java fără sintaxa Companion.

Object expressions (obiecte anonime)

Object expression — este un obiect anonim creat pe loc pentru a suprascrie metodele unei clase sau interfețe fără a declara o clasă numită separată.

kotlin
val handler = object : Runnable {
    override fun run() {
        println("Sarcină executată")
    }
}

thread(handler)

Object expressions diferă de declarațiile object prin faptul că creează o nouă instanță la fiecare execuție. Ele nu sunt singleton și nu au nume. Obiectele anonime pot captura variabile din închidere, la fel ca și lambdele.

Spre deosebire de Java, unde clasele anonime pot moșteni doar un singur tip, Kotlin object expression poate moșteni mai multe tipuri simultan.

kotlin
interface Clickable {
    fun click()
}

abstract class View {
    abstract fun render()
}

val button = object : View(), Clickable {
    override fun render() = println("Randare buton")
    override fun click() = println("Buton apăsat")
}

Scenarii practice de utilizare

Object — una dintre cele mai versatile construcții din Kotlin, folosită în numeroase scenarii.

Repository-uri singleton

În proiectele Android, object este adesea folosit pentru a declara Repository, unde nu sunt necesare mai multe instanțe. O singură instanță garantează consistența datelor.

kotlin
object UserRepository {
    fun getUser(id: Int): User? {
        // obținerea utilizatorului
        return null
    }
}

Metode fabrică prin companion object

Companion object cu metode fabrică — o alternativă la constructorii multipli. Metodele fabrică denumite fac codul auto-documentat.

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

Constante și enumerări

Object poate servi ca container pentru constante, înlocuind câmpurile static final din Java. În același timp, object suportă moștenirea, permițând crearea de ierarhii de configurații.

Conform Kotlin Standard Library (2026), object declaration este cel mai performant mod de a crea un singleton în Kotlin, depășind ca viteză implementările „double-checked locking” și fiind comparabil cu enum singleton din Java.

Întrebări frecvente

Cu ce diferă object de o clasă obișnuită?

Object declară simultan o clasă și creează singura sa instanță. O clasă obișnuită poate avea mai multe instanțe create prin constructor.

Când se inițializează object declaration?

Leneș — la prima accesare a obiectului. Până atunci, memoria nu este alocată, iar codul din blocul init nu se execută.

Poate object să aibă un constructor?

Nu, object nu poate avea un constructor explicit. Inițializarea se face în blocul init, care este apelat o singură dată la prima accesare a obiectului.

Cu ce diferă companion object de object obișnuit?

companion object — este un object declarat în interiorul unei clase. Membrii săi sunt accesibili prin numele clasei fără a crea o instanță, ceea ce înlocuiește membrii statici din Java.

Sunt object declarations sigure în medii multi-thread?

Da, inițializarea object este complet thread-safe datorită inițializatorului static JVM. Nu este necesară nicio sincronizare suplimentară.

Rezumat

  • object — singleton declarativ cu inițializare leneșă și thread-safe
  • companion object — membri statici în Kotlin, metode fabrică, constante
  • Object expression — obiecte anonime pe loc cu capturarea variabilelor din închidere
  • Moștenire — object poate moșteni clase și interfețe, inclusiv mai multe tipuri
  • Performanță — inițializare prin static initializer JVM, fără overhead double-checked locking
  • Utilizare — servicii singleton, repository, constante, fabrici, adaptoare de listener
  • Limitări — fără constructor explicit, o singură instanță pe întreaga JVM

Vom dezvolta o aplicație mobilă la cheie

IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.

Discutați proiectul

Citiți și