0Pricing
Kotlin Academy · Lección

companion object: miembros similares a los estáticos en Kotlin

Añada companion objects a las clases para simular métodos y constantes estáticos.

companion object: miembros similares a los estáticos en Kotlin es una lección gratuita de Kotlin Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Kotlin Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Kotlin Academy incluye 4 lecciones en total.

No hay static, pero sí companion object

Kotlin no tiene la palabra clave static. En su lugar, un companion object declarado dentro de una clase proporciona miembros de nivel de clase (similares a los estáticos).

Declaración de un companion object

Coloque un companion object dentro de una clase. Puede llamar a sus miembros como ClassName.member.

class MathUtils {
    companion object {
        fun square(x: Int) = x * x
    }
}
fun main() {
    println(MathUtils.square(5)) // 25
}

Constantes en un companion object

Normalmente, las constantes se colocan en el companion object, a menudo con const val para literales evaluados en tiempo de compilación.

class HttpClient {
    companion object {
        const val DEFAULT_TIMEOUT = 5000
        const val USER_AGENT = "MyApp/1.0"
    }
}
fun main() {
    println(HttpClient.DEFAULT_TIMEOUT)
    println(HttpClient.USER_AGENT)
}

Companion object con nombre

Puede asignar un nombre al companion object. Funcionan tanto ClassName.member como ClassName.CompanionName.member.

class Database {
    companion object Factory {
        fun create() = Database()
    }
}
fun main() {
    val db1 = Database.create()       // works
    val db2 = Database.Factory.create() // also works
    println("$db1 / $db2")
}

Patrón Factory Method

Utilice el objeto companion para crear instancias con validación o una lógica de construcción alternativa.

class User private constructor(val name: String, val email: String) {
    companion object {
        fun create(name: String, email: String): User {
            require(email.contains("@")) { "invalid email" }
            return User(name, email)
        }
    }
}
fun main() {
    val u = User.create("Ada", "ada@example.com")
    println("${u.name} <${u.email}>")
}

Implementación de interfaces

El propio objeto companion puede implementar interfaces; esto resulta útil para combinarlo con clases que necesiten un contrato similar a uno estático.

interface Loadable<T> { fun load(): T }
class Config(val data: String) {
    companion object : Loadable<Config> {
        override fun load() = Config("loaded data")
    }
}
fun main() {
    println(Config.load().data)
}

@JvmStatic para la interoperabilidad con Java

Anote los miembros del objeto companion con @JvmStatic para exponerlos como métodos estáticos reales a los llamadores de Java.

class Util {
    companion object {
        @JvmStatic
        fun greet(name: String) = "Hello, $name!"
    }
}
fun main() {
    println(Util.greet("Kotlin"))
    // In Java: Util.greet("Java")
}

Acceder directamente al objeto companion

ClassName.Companion hace referencia directamente al objeto companion. Utilícelo cuando necesite pasarlo como argumento.

class Counter {
    companion object {
        fun greet() = "hi from companion"
    }
}
fun main() {
    val ref = Counter.Companion
    println(ref.greet())
}

Companion frente a nivel superior

Para las funciones de utilidad que no pertenecen a una clase, prefiera las funciones de nivel superior a una clase que solo tenga un objeto companion.

// File-level — usually cleaner:
fun greet(name: String) = "Hi, $name!"
// Versus:
class Greeter { companion object { fun greet(n: String) = "Hi, $n!" } }
fun main() {
    println(greet("Ada"))
    println(Greeter.greet("Ada"))
}

Un solo companion por clase

Una clase puede tener como máximo un objeto companion. Si es necesario, los objetos normales internos pueden contener estado compartido adicional.

class Service {
    companion object {
        val version = "1.0"
    }
    object InternalHelper { fun log() = println("internal") }
}
fun main() {
    println(Service.version)
    Service.InternalHelper.log()
}

Funciones de extensión del companion

Puede extender el objeto companion desde fuera de la clase y añadir funciones auxiliares pseudoestáticas.

class Lib {
    companion object
}
fun Lib.Companion.helper() = "added later"
fun main() {
    println(Lib.helper())
}

Comprobación rápida

¿Cuál es el equivalente de Kotlin para los miembros static de Java?

Resumen

Kotlin no tiene static. Utilice un objeto companion para los miembros de nivel de clase: constantes, factorías e implementaciones de interfaces. Anótelo con @JvmStatic para la interoperabilidad con Java o extiéndalo con funciones de extensión para obtener funciones auxiliares pseudoestáticas.

Preguntas frecuentes

¿La lección «companion object: miembros similares a los estáticos en Kotlin» es gratis?

Sí — el texto completo de «companion object: miembros similares a los estáticos en Kotlin» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Kotlin Academy, actualiza a CoddyKit PRO. El curso de Kotlin Academy incluye 4 lecciones en total.

¿Qué aprenderé en «companion object: miembros similares a los estáticos en Kotlin»?

Añada companion objects a las clases para simular métodos y constantes estáticos. Practicas Kotlin Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Kotlin Academy?

No se requiere experiencia previa. Kotlin Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «companion object: miembros similares a los estáticos en Kotlin»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Kotlin Academy?

Sí. Cada lección de Kotlin Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Declaración object: singletons de Kotlin
  2. companion object: miembros similares a los estáticos en Kotlin
  3. Objetos anónimos y expresiones de objeto
  4. Métodos de fábrica con companion object
← Volver a Kotlin Academy