Sobes.tech
Middle

Kuo skiriasi objektas klasės viduje ir bendrasis objektas Kotlin?

sobes.tech AI

Atsakymas iš AI

Objektas klasės viduje (inner object) yra susietas su išorinio klaso egzemplioriumi ir egzistuoja tik jo gyvavimo ciklo metu. Objekto partneris (companion object) egzistuoja kaip singletonas, nesusijęs su klaso egzemplioriumi ir gali būti pasiekiamas tiesiogiai per klaso pavadinimą.

Pagrindiniai skirtumai:

  • Susiejimas su egzemplioriumi: inner object yra susietas su išorinio klaso egzemplioriumi, companion object nėra.
  • Prieiga: prie inner object galima prieiti tik per išorinio klaso egzempliorių, prie companion object - tiesiogiai per klaso pavadinimą.
  • Būklė: inner object gali turėti būseną, būdingą egzemplioriui, companion object - bendrą viso klaso būseną.
  • Naudojimas: inner object dažnai naudojamas State šablono įgyvendinimui arba susijusių objektų grupavimui klaso egzemplioriaus viduje. companion object naudojamas fabrikos metodams, konstantoms ar statiniams klases nariams.

Pavyzdys:

class Outer {
    private var outerValue: Int = 0

    inner object InnerObject {
        fun accessOuterValue(): Int {
            return outerValue // inner object turi prieigą prie išorinio klaso narių
        }
    }

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

        fun createOuter(): Outer {
            return Outer() // fabrikos metodas
        }
    }
}

fun main() {
    val outer = Outer.CompanionObject.createOuter() // prieiga prie companion object
    // val inner = Outer.InnerObject // klaida: negalima pasiekti InnerObject be išorinio klaso egzemplioriaus
    val inner = outer.InnerObject // prieiga prie inner object per egzempliorių

    println(inner.accessOuterValue())
    println(Outer.CompanionObject.CONSTANT)
    println(Outer.CONSTANT) // sintaksės cukrus prieigai prie CompanionObject narių
}