Middle
Jaka jest różnica między obiektem wewnątrz klasy a obiektem towarzyszącym w Kotlin?
sobes.tech AI
Odpowiedź od AI
Obiekt wewnętrzny (inner object) w klasie jest powiązany z instancją klasy zewnętrznej i istnieje tylko w jej cyklu życia. Obiekt towarzyszący (companion object) istnieje jako singleton, nie jest powiązany z instancją klasy i może być dostępny bezpośrednio przez nazwę klasy.
Główne różnice:
- Powiązanie z instancją:
inner objectjest powiązany z instancją klasy zewnętrznej,companion objectnie. - Dostęp: do
inner objectmożna uzyskać dostęp tylko przez instancję klasy zewnętrznej, docompanion objectbezpośrednio przez nazwę klasy. - Stan:
inner objectmoże mieć stan specyficzny dla instancji,companion objectjest wspólny dla całej klasy. - Użycie:
inner objectjest często używany do implementacji wzorca State lub do grupowania powiązanych obiektów wewnątrz instancji.companion objectjest używany do metod fabrycznych, stałych lub statycznych członków klasy.
Przykład:
class Outer {
private var outerValue: Int = 0
inner object InnerObject {
fun accessOuterValue(): Int {
return outerValue // inner object ma dostęp do członków klasy zewnętrznej
}
}
companion object CompanionObject {
const val CONSTANT = "Some constant"
fun createOuter(): Outer {
return Outer() // metoda fabryczna
}
}
}
fun main() {
val outer = Outer.CompanionObject.createOuter() // dostęp do obiektu towarzyszącego
// val inner = Outer.InnerObject // Błąd: nie można uzyskać dostępu do InnerObject bez instancji Outer
val inner = outer.InnerObject // dostęp do obiektu wewnętrznego przez instancję
println(inner.accessOuterValue())
println(Outer.CompanionObject.CONSTANT)
println(Outer.CONSTANT) // cukier składniowy do dostępu do członków CompanionObject
}