Explica qué es un 'companion object' en el lenguaje Kotlin y en qué casos debería usarse.
sobes.tech AI
Respuesta de la IA
companion object — es un objeto especial asociado con una clase, pero que no es una instancia de ella. Funciona como miembros estáticos en Java.
Puntos clave:
- Se declara dentro de la clase usando la palabra clave
companion object. - Tiene acceso a los miembros privados de la clase.
- Puede tener un nombre, pero generalmente se omite (se usa el nombre
Companion). - Se puede acceder directamente a los miembros del
companion objectmediante el nombre de la clase, sin crear una instancia.
Ejemplos de uso:
-
Métodos de fábrica: Para crear instancias de la clase con lógica de inicialización más compleja que los constructores normales.
class MyClass private constructor(val value: String) { // Constructor privado companion object { fun create(input: String): MyClass { // Método de fábrica // Lógica de procesamiento de input return MyClass("Processed: $input") } } } fun main() { val instance = MyClass.create("some data") // Uso del método de fábrica println(instance.value) } -
Constantes a nivel de clase: Para definir valores que deben estar disponibles sin crear una instancia.
class Constants { companion object { const val DEFAULT_VALUE = "default" // Constante } } fun main() { println(Constants.DEFAULT_VALUE) // Acceso a la constante } -
Implementación de interfaces:
companion objectpuede implementar interfaces, lo cual es útil para simular fábricas estáticas con funcionalidad común.interface Factory<T> { fun create(): T } class MyData(val id: Int) { companion object : Factory<MyData> { private var nextId = 0 override fun create(): MyData { return MyData(nextId++) } } } fun main() { val data1 = MyData.create() val data2 = MyData.create() println(data1.id) println(data2.id) } -
Extensiones: Se puede extender un
companion object, lo que permite agregar métodos "estáticos" a la clase desde fuera.class MyUtil { companion object { // Objeto companion vacío } } fun MyUtil.Companion.helperMethod() { // Extensión del objeto companion println("Called helper method") } fun main() { MyUtil.helperMethod() }
En general, se debe usar companion object cuando se requiere funcionalidad relacionada con la clase, pero que no necesita una instancia de la misma. Es una forma más idiomática en Kotlin de lograr lo que en Java se hace con miembros estáticos, ofreciendo mayor flexibilidad (por ejemplo, en la implementación de interfaces y extensiones). No se debe abusar de él para almacenar estado que debe ser único para cada instancia.