Limitaciones
Qué no pueden hacer las clases de valor
Limitaciones es una lección gratuita de Kotlin Academy en CoddyKit. Esta es la lección 4 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.
Conocer los límites
Las clases de valor son potentes, pero tienen restricciones. Comprender sus límites le ayuda a elegir la herramienta adecuada y evitar sorpresas.
Exactamente una propiedad
Una clase de valor envuelve un único valor. Para agrupar varios campos necesita una clase normal o una data class.
// @JvmInline value class Range(val lo: Int, val hi: Int) // not allowed
data class Range(val lo: Int, val hi: Int)
fun main() {
println(Range(1, 10))
}Sin estado de init más allá del valor
Las clases de valor no pueden tener campos de respaldo aparte de la única propiedad del constructor. No se permite añadir estado var con un campo de respaldo.
@JvmInline
value class Counter(val value: Int) {
// val cached: Int = value * 2 // not allowed: extra backing field
val doubled: Int get() = value * 2 // computed is fine
}
fun main() {
println(Counter(3).doubled)
}Sin herencia
Las clases de valor son implícitamente final. No pueden extender otras clases ni se pueden extender. Solo pueden implementar interfaces.
interface Named { val label: String }
@JvmInline
value class Tag(val text: String) : Named {
override val label: String get() = text
}
fun main() {
println(Tag("urgent").label)
}El coste del boxing reaparece
La promesa de no tener sobrecoste desaparece cuando el valor se usa como tipo nullable, genérico o de interfaz. Entonces el compilador lo encapsula mediante boxing en un objeto real.
@JvmInline
value class Id(val raw: Int)
fun main() {
val list: List<Id> = listOf(Id(1), Id(2)) // boxed inside the list
println(list.map { it.raw })
}Sin identidad
Las clases de valor no tienen una identidad referencial estable. La igualdad de referencias con === carece de sentido y no se pueden usar donde importa la identidad del objeto, como en un bloqueo de sincronización.
@JvmInline
value class Code(val value: Int)
fun main() {
val a = Code(5)
val b = Code(5)
println(a == b) // structural equality works
}No puede ser lateinit ni delegada
No puede aplicar lateinit al valor subyacente, y las clases de valor no admiten delegación de propiedades en su único campo. El valor debe establecerse en el constructor.
@JvmInline
value class Slug(val value: String)
fun main() {
val s = Slug("hello-world") // must be provided up front
println(s.value)
}Name mangling en la JVM
En la JVM, las funciones que reciben parámetros de clases de valor obtienen nombres modificados en el bytecode para evitar conflictos. Esto complica la interoperabilidad con Java; es posible que el código Java que las invoque no las vea correctamente.
@JvmInline
value class Hz(val value: Int)
fun tune(freq: Hz) = freq.value
fun main() {
println(tune(Hz(440))) // simple from Kotlin; mangled from Java
}No son envoltorios para varios campos
Si se descubre deseando tener dos propiedades, una clase de valor no es la herramienta adecuada. Recurra a una data class y acepte la asignación de un objeto a cambio de una estructura más rica.
data class Coordinate(val lat: Double, val lng: Double)
fun main() {
println(Coordinate(41.0, 29.0))
}Resumen de limitaciones
Las clases de valor no pueden:
- Contener más de una propiedad
- Tener campos de respaldo adicionales ni
lateinit - Heredar de clases ni ser heredadas por ellas
- Ofrecer identidad referencial
- Evitar siempre el boxing
Elegir con criterio
Use una clase de valor para un único valor validado y seguro en cuanto al tipo. Use una data class para datos agrupados. Use un alias de tipo cuando solo busque legibilidad y no seguridad. Cada herramienta tiene su lugar.
Comprobación rápida
Compruebe su comprensión de las limitaciones de las clases de valor.
Recapitulación
Ha aprendido las limitaciones de las clases de valor:
- Una sola propiedad y ningún campo de respaldo adicional
- Sin herencia ni identidad
- El boxing reaparece al usarlas como nullable, genéricas o como interfaz
- El name mangling de la JVM complica la interoperabilidad con Java
Elija la herramienta según la necesidad.
Preguntas frecuentes
¿La lección «Limitaciones» es gratis?
Sí — el texto completo de «Limitaciones» 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 «Limitaciones»?
Qué no pueden hacer las clases de valor 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 4 de 4.
¿Cuánto tiempo toma la lección «Limitaciones»?
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.