Sobes.tech
Middle

¿Cuál es la diferencia entre un objeto dentro de una clase y un compañero de objeto en Kotlin?

sobes.tech AI

Respuesta de la IA

Un objeto interno (inner object) dentro de una clase está vinculado a una instancia de la clase externa y solo existe durante su ciclo de vida. El objeto compañero (companion object) existe como un singleton, no vinculado a una instancia de la clase, y puede ser accedido directamente mediante el nombre de la clase.

Diferencias principales:

  • Vinculación a la instancia: inner object está vinculado a una instancia de la clase externa, companion object no.
  • Acceso: se puede acceder a inner object solo a través de una instancia de la clase externa, a companion object directamente mediante el nombre de la clase.
  • Estado: inner object puede tener un estado específico de la instancia, companion object es común a toda la clase.
  • Uso: inner object se usa a menudo para implementar patrones como State o para agrupar objetos relacionados dentro de una instancia. companion object se usa para métodos de fábrica, constantes o miembros estáticos de la clase.

Ejemplo:

class Outer {
    private var outerValue: Int = 0

    inner object InnerObject {
        fun accessOuterValue(): Int {
            return outerValue // inner object tiene acceso a los miembros de la clase externa
        }
    }

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

        fun createOuter(): Outer {
            return Outer() // método de fábrica
        }
    }
}

fun main() {
    val outer = Outer.CompanionObject.createOuter() // acceso al companion object
    // val inner = Outer.InnerObject // Error: no se puede acceder a InnerObject sin una instancia de Outer
    val inner = outer.InnerObject // acceso al inner object a través de la instancia

    println(inner.accessOuterValue())
    println(Outer.CompanionObject.CONSTANT)
    println(Outer.CONSTANT) // azúcar sintáctico para acceder a los miembros de CompanionObject
}