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 objectlze 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 objectmůž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 objectlze 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.