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 objectestá vinculado a una instancia de la clase externa,companion objectno. - Acceso: se puede acceder a
inner objectsolo a través de una instancia de la clase externa, acompanion objectdirectamente mediante el nombre de la clase. - Estado:
inner objectpuede tener un estado específico de la instancia,companion objectes común a toda la clase. - Uso:
inner objectse usa a menudo para implementar patrones como State o para agrupar objetos relacionados dentro de una instancia.companion objectse 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
}