Sobes.tech
Middle

Jaký je rozdíl mezi objektem uvnitř třídy a companion objektem v Kotlinu?

sobes.tech AI

Odpověď od AI

Vnitřní objekt (inner object) uvnitř třídy je vázán na instanci vnější třídy a existuje pouze během jejího životního cyklu. Společný objekt (companion object) existuje jako singleton, není vázán na instanci třídy a může být přímo přístupný přes název třídy.

Hlavní rozdíly:

  • Vazba na instanci: inner object je vázán na instanci vnější třídy, companion object ne.
  • Přístup: k inner object lze přistupovat pouze přes instanci vnější třídy, k companion object přímo přes název třídy.
  • Stav: inner object může mít stav specifický pro instanci, companion object je společný pro celou třídu.
  • Použití: inner object se často používá k implementaci vzoru State nebo ke skupinování souvisejících objektů uvnitř instance. companion object se používá pro tovární metody, konstanty nebo statické členy třídy.

Příklad:

class Outer {
    private var outerValue: Int = 0

    inner object InnerObject {
        fun accessOuterValue(): Int {
            return outerValue // inner object má přístup ke členům vnější třídy
        }
    }

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

        fun createOuter(): Outer {
            return Outer() // tovární metoda
        }
    }
}

fun main() {
    val outer = Outer.CompanionObject.createOuter() // přístup ke companion object
    // val inner = Outer.InnerObject // Chyba: nelze přistupovat k InnerObject bez instance Outer
    val inner = outer.InnerObject // přístup k inner object přes instanci

    println(inner.accessOuterValue())
    println(Outer.CompanionObject.CONSTANT)
    println(Outer.CONSTANT) // syntaktický cukr pro přístup ke členům CompanionObject
}