Sobes.tech
Junior

Vysvetlite, čo je 'companion object' v jazyku Kotlin a v akých prípadoch by sa mal použiť.

sobes.tech AI

Odpoveď od AI

companion object je špeciálny objekt spojený s triedou, ale nie je jej jej inštanciou. Funguje ako statické členy v Jave.

Kľúčové body:

  • Deklaruje sa vo vnútri triedy pomocou kľúčového slova companion object.
  • Má prístup k súkromným členom triedy.
  • Môže mať meno, ale zvyčajne sa vynecháva (používa sa meno Companion).
  • Členovia companion object môžu byť priamo oslovovaní cez meno triedy bez vytvorenia inštancie.

Príklady použitia:

  • Fabrické metódy: Na vytváranie inštancií triedy s komplexnejšou logikou inicializácie ako bežné konštruktory.

    class MyClass private constructor(val value: String) { // Súkromný konštruktor
    
        companion object {
            fun create(input: String): MyClass { // Fabrická metóda
                // Logika spracovania inputu
                return MyClass("Processed: $input")
            }
        }
    }
    
    fun main() {
        val instance = MyClass.create("some data") // Použitie fabríkovej metódy
        println(instance.value)
    }
    
  • Konštanty na úrovni triedy: Na definovanie hodnôt, ku ktorým je možné pristupovať bez vytvorenia inštancie.

    class Constants {
        companion object {
            const val DEFAULT_VALUE = "default" // Konštanta
        }
    }
    
    fun main() {
        println(Constants.DEFAULT_VALUE) // Prístup ku konštante
    }
    
  • Implementácia rozhraní: companion object môže implementovať rozhrania, čo je užitočné na napodobnenie statických fabrík s všeobecnou funkcionalitou.

    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)
    }
    
  • Rozšírenia: companion object je možné rozširovať, čo umožňuje pridávať "statické" metódy do triedy zvonku.

    class MyUtil {
        companion object {
            // Prázdny companion objekt
        }
    }
    
    fun MyUtil.Companion.helperMethod() { // Rozšírenie companion objektu
        println("Called helper method")
    }
    
    fun main() {
        MyUtil.helperMethod()
    }
    

Celkovo by mal byť companion object používaný, keď je potrebná funkcionalita, ktorá je logicky spojená s triedou, ale nevyžaduje jej inštanciu. Je to idiomatický spôsob v Kotlinu, ako dosiahnuť to, čo v Jave sa dosahuje pomocou statických členov, pričom ponúka väčšiu flexibilitu (napríklad pri implementácii rozhraní a rozšírenia). Nemal by sa zneužívať na ukladanie stavu, ktorý by mal byť jedinečný pre každý inštanciu.