Sobes.tech
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 object jest powiązany z instancją klasy zewnętrznej, companion object nie.
  • Dostęp: do inner object można uzyskać dostęp tylko przez instancję klasy zewnętrznej, do companion object bezpośrednio przez nazwę klasy.
  • Stan: inner object może mieć stan specyficzny dla instancji, companion object jest wspólny dla całej klasy.
  • Użycie: inner object jest często używany do implementacji wzorca State lub do grupowania powiązanych obiektów wewnątrz instancji. companion object jest 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
}