Sobes.tech
Junior

Explică ce este un 'companion object' în limbajul Kotlin și în ce cazuri ar trebui utilizat.

sobes.tech AI

Răspuns de la AI

companion object — un obiect special asociat cu o clasă, dar care nu este o instanță a acesteia. Funcționează ca membri statici în Java.

Puncte cheie:

  • Este declarat în interiorul clasei folosind cuvântul cheie companion object.
  • Are acces la membrii privați ai clasei.
  • Poate avea un nume, dar de obicei este omis (se folosește numele Companion).
  • Membrii companion object pot fi accesați direct prin numele clasei, fără a crea o instanță.

Exemple de utilizare:

  • Metode de fabrică: Pentru a crea instanțe ale clasei cu logică de inițializare mai complexă decât constructorii obișnuiți.

    class MyClass private constructor(val value: String) { // Constructor privat
    
        companion object {
            fun create(input: String): MyClass { // Metodă de fabrică
                // Logică de procesare a input-ului
                return MyClass("Processed: $input")
            }
        }
    }
    
    fun main() {
        val instance = MyClass.create("some data") // Utilizarea metodei de fabrică
        println(instance.value)
    }
    
  • Constante la nivel de clasă: Pentru a defini valori care trebuie să fie accesibile fără a crea o instanță.

    class Constants {
        companion object {
            const val DEFAULT_VALUE = "default" // Constantă
        }
    }
    
    fun main() {
        println(Constants.DEFAULT_VALUE) // Acces la constantă
    }
    
  • Implementarea interfețelor: companion object poate implementa interfețe, ceea ce este util pentru a simula fabrici statice cu funcționalitate comună.

    interface Factory<T> {
        fun create(): T
    }
    
    class MyData(val id: Int) {
        companion object : Factory<MyData> {
            private var nextId = 0
            override fun create(): MyData {
                return MyData(nextId++)
            }
        }
    }
    
    fun main() {
        val data1 = MyData.create()
        val data2 = MyData.create()
        println(data1.id)
        println(data2.id)
    }
    
  • Extensii: companion object poate fi extins, permițând adăugarea de metode "statice" în afara clasei.

    class MyUtil {
        companion object {
            // Obiect companion gol
        }
    }
    
    fun MyUtil.Companion.helperMethod() { // Extensie a obiectului companion
        println("Called helper method")
    }
    
    fun main() {
        MyUtil.helperMethod()
    }
    

În general, companion object trebuie utilizat atunci când este necesară funcționalitate logic legată de clasă, dar care nu necesită o instanță a acesteia. Este o modalitate mai idiomatică în Kotlin de a realiza ceea ce în Java se face cu membrii statici, oferind în același timp o flexibilitate mai mare (de exemplu, în implementarea interfețelor și extensiilor). Nu trebuie folosit abuziv pentru stocarea de stare care trebuie să fie unică pentru fiecare instanță.