Sobes.tech
Junior

Vysvětlete, co je 'companion object' v jazyce Kotlin a v jakých případech by měl být použit.

sobes.tech AI

Odpověď od AI

companion object je speciální objekt spojený s třídou, ale není jejím jejím instance. Funguje jako statické členy v Javě.

Hlavní body:

  • Deklaruje se uvnitř třídy pomocí klíčového slova companion object.
  • Má přístup k soukromým členům třídy.
  • Může mít jméno, ale obvykle se vynechává (používá se jméno Companion).
  • Členové companion object lze přímo oslovit přes jméno třídy bez vytvoření instance.

Příklady použití:

  • Fabrické metody: Pro vytváření instancí třídy s složitější logikou inicializace než běžné konstruktory.

    class MyClass private constructor(val value: String) { // Privátní konstruktor
    
        companion object {
            fun create(input: String): MyClass { // Fabrická metoda
                // Logika zpracování inputu
                return MyClass("Processed: $input")
            }
        }
    }
    
    fun main() {
        val instance = MyClass.create("some data") // Použití fabrikové metody
        println(instance.value)
    }
    
  • Konstanty na úrovni třídy: Pro definování hodnot, ke kterým lze přistupovat bez vytvoření instance.

    class Constants {
        companion object {
            const val DEFAULT_VALUE = "default" // Konstantní hodnota
        }
    }
    
    fun main() {
        println(Constants.DEFAULT_VALUE) // Přístup ke konstantě
    }
    
  • Implementace rozhraní: companion object může implementovat rozhraní, což je užitečné pro napodobení statických továren s obecnou 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šíření: companion object lze rozšiřovat, což umožňuje přidávat "statické" metody do třídy zvenčí.

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

Celkově by měl být companion object používán, když je potřeba funkčnost, která je logicky spojena s třídou, ale nevyžaduje její instanci. Je to idiomatický způsob v Kotlinu, jak dosáhnout toho, co v Javě lze s pomocí statických členů, s větší flexibilitou (například v implementaci rozhraní a rozšíření). Neměl by být zneužíván pro ukládání stavu, který by měl být unikátní pro každou instanci.