Sobes.tech
Middle

Qual è la differenza tra un oggetto all'interno di una classe e un companion object in Kotlin?

sobes.tech AI

Risposta dell'AI

Un oggetto interno (inner object) all'interno di una classe è legato a un'istanza della classe esterna ed esiste solo durante il suo ciclo di vita. L'oggetto companion (companion object) esiste come singleton, non legato a un'istanza della classe, e può essere accessibile direttamente tramite il nome della classe.

Principali differenze:

  • Collegamento all'istanza: inner object è legato a un'istanza della classe esterna, companion object no.
  • Accesso: si può accedere a inner object solo tramite un'istanza della classe esterna, a companion object direttamente tramite il nome della classe.
  • Stato: inner object può avere uno stato specifico dell'istanza, companion object è comune a tutta la classe.
  • Utilizzo: inner object viene spesso usato per implementare il pattern State o per raggruppare oggetti correlati all'interno di un'istanza. companion object viene usato per metodi di fabbrica, costanti o membri statici della classe.

Esempio:

class Outer {
    private var outerValue: Int = 0

    inner object InnerObject {
        fun accessOuterValue(): Int {
            return outerValue // inner object ha accesso ai membri della classe esterna
        }
    }

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

        fun createOuter(): Outer {
            return Outer() // metodo di fabbrica
        }
    }
}

fun main() {
    val outer = Outer.CompanionObject.createOuter() // accesso al companion object
    // val inner = Outer.InnerObject // Errore: impossibile accedere a InnerObject senza un'istanza di Outer
    val inner = outer.InnerObject // accesso all'inner object tramite l'istanza

    println(inner.accessOuterValue())
    println(Outer.CompanionObject.CONSTANT)
    println(Outer.CONSTANT) // zucchero sintattico per l'accesso ai membri di CompanionObject
}