Sobes.tech
Middle

Care este diferența dintre un obiect din interiorul unei clase și un companion object în Kotlin?

sobes.tech AI

Răspuns de la AI

Un obiect intern (inner object) dintr-o clasă este legat de o instanță a clasei externe și există doar în timpul ciclului său de viață. Obiectul companion (companion object) există ca un singleton, nelegat de o instanță a clasei și poate fi accesat direct prin numele clasei.

Diferențele principale:

  • Legătura cu instanța: inner object este legat de o instanță a clasei externe, companion object nu.
  • Acces: se poate accesa inner object doar printr-o instanță a clasei externe, companion object direct prin numele clasei.
  • Stare: inner object poate avea o stare specifică instanței, companion object este comun pentru întreaga clasă.
  • Utilizare: inner object este adesea folosit pentru implementarea pattern-ului State sau pentru gruparea obiectelor legate în interiorul unei instanțe. companion object este folosit pentru metode de fabrică, constante sau membri statici ai clasei.

Exemplu:

class Outer {
    private var outerValue: Int = 0

    inner object InnerObject {
        fun accessOuterValue(): Int {
            return outerValue // inner object are acces la membrii clasei externe
        }
    }

    companion object CompanionObject {
        const val CONSTANT = "Some constant"

        fun createOuter(): Outer {
            return Outer() // metodă de fabrică
        }
    }
}

fun main() {
    val outer = Outer.CompanionObject.createOuter() // acces la obiectul companion
    // val inner = Outer.InnerObject // Eroare: nu se poate accesa InnerObject fără o instanță a lui Outer
    val inner = outer.InnerObject // acces la obiectul intern prin instanță

    println(inner.accessOuterValue())
    println(Outer.CompanionObject.CONSTANT)
    println(Outer.CONSTANT) // zahăr sintactic pentru accesarea membrilor din CompanionObject
}