0Pricing
Kotlin Academy · Lección

Clases de valor inline

Envuelva valores sin sobrecoste

Clases de valor inline 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.

El problema de envolver tipos primitivos

Envolver un tipo primitivo en una clase aporta seguridad de tipos, pero normalmente tiene el coste de una asignación en el heap. Las clases de valor ofrecen esa seguridad mientras el compilador elimina el envoltorio siempre que es posible.

Declarar una clase de valor

Marque una clase como @JvmInline value class con exactamente una propiedad en el constructor primario. Se comporta como un tipo distinto.

@JvmInline
value class Password(val value: String)

fun main() {
    val p = Password("secret")
    println(p.value)
}

Un tipo distinto

A diferencia de un alias de tipo, una clase de valor es un tipo independiente. No puede pasar accidentalmente un String sin envolver donde se espera un Password.

@JvmInline
value class Password(val value: String)

fun login(p: Password) = println("login with " + p.value)

fun main() {
    login(Password("hunter2"))
}

Sin sobrecoste

En tiempo de ejecución, el compilador normalmente hace inline del valor subyacente, por lo que no se asigna ningún objeto adicional. Un Password se representa como un String simple en la mayoría de las rutas de ejecución.

@JvmInline
value class Meters(val amount: Double)

fun main() {
    val d = Meters(5.0)
    println(d.amount) // stored inline as a Double
}

Métodos y propiedades

Las clases de valor pueden tener funciones y propiedades calculadas, igual que las clases normales.

@JvmInline
value class Celsius(val degrees: Double) {
    fun toFahrenheit() = degrees * 9 / 5 + 32
}

fun main() {
    println(Celsius(100.0).toFahrenheit())
}

Bloques init para validación

Un bloque init permite validar el valor envuelto durante la construcción, garantizando que cada instancia sea válida.

@JvmInline
value class Percentage(val value: Int) {
    init {
        require(value in 0..100) { "out of range" }
    }
}

fun main() {
    println(Percentage(75).value)
}

Propiedades calculadas

Puede añadir propiedades calculadas que se deriven del único valor almacenado, manteniendo la lógica cerca del tipo.

@JvmInline
value class Seconds(val value: Int) {
    val asMinutes: Double get() = value / 60.0
}

fun main() {
    println(Seconds(120).asMinutes)
}

Implementar interfaces

Las clases de valor pueden implementar interfaces, lo que permite usarlas polimórficamente. Nota: al tratarlas como el tipo de la interfaz, esto puede forzar el boxing.

interface Describable {
    fun describe(): String
}

@JvmInline
value class Money(val cents: Int) : Describable {
    override fun describe() = "$" + cents / 100.0
}

fun main() {
    println(Money(1599).describe())
}

Cuándo ocurre el boxing

El envoltorio reaparece mediante boxing cuando el valor se usa como nullable, como interfaz o en una colección genérica. En esos casos, el compilador crea un objeto real: sigue siendo correcto, pero es menos eficiente.

@JvmInline
value class Id(val raw: Int)

fun main() {
    val direct = Id(1)        // inlined
    val boxed: Id? = Id(2)    // boxed because nullable
    println("" + direct.raw + " " + boxed?.raw)
}

value frente a data class

Una data class siempre requiere asignar un objeto y puede contener muchas propiedades. Una value class contiene exactamente una y busca no tener sobrecoste. Elija clases de valor para envoltorios ligeros y seguros en cuanto al tipo alrededor de un único valor.

Por qué es importante

Las clases de valor le permiten:

  • Evitar confundir parámetros con tipos similares
  • Asociar validación a un tipo primitivo
  • Normalmente no pagar ningún coste en tiempo de ejecución

Son la respuesta segura en cuanto al tipo cuando los alias se quedan cortos.

Comprobación rápida

Compruebe su comprensión de las clases de valor inline.

Recapitulación

Ha aprendido sobre las clases de valor inline:

  • Se declaran como @JvmInline value class con una propiedad
  • Son un tipo distinto y normalmente no tienen sobrecoste
  • Admiten métodos, propiedades calculadas y validación mediante init
  • El boxing ocurre cuando se usan como nullable, genéricas o como interfaz

A continuación: casos de uso reales.

Preguntas frecuentes

¿La lección «Clases de valor inline» es gratis?

Sí — el texto completo de «Clases de valor inline» 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 «Clases de valor inline»?

Envuelva valores sin sobrecoste 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 «Clases de valor inline»?

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. Aliases de tipos
  2. Clases de valor inline
  3. Casos de uso
  4. Limitaciones
← Volver a Kotlin Academy