inline class (desde Kotlin 1.5 — value class) permite crear envoltorios sobre primitivos sin crear un objeto separado en tiempo de ejecución. Esto se utiliza para aumentar la seguridad de tipos sin el costo de la asignación de memoria. Bajo el capó, estos objetos pueden compilarse en el primitivo correspondiente.
Ejemplo:
@JvmInline value class UserId(val id: String) fun printUserId(userId: UserId) { println(userId.id) }
El uso de inline/value classes es importante para la tipificación de identificadores, dinero, unidades de medida, etc.
¿Puede una value class tener más de una propiedad?
Respuesta: No. Una value class puede contener solo una propiedad en el constructor principal.
Ejemplo de código erróneo:
@JvmInline value class Money(val amount: Int, val currency: String) // Error de compilación
Historia
En una casa de cambio, se utilizó inline class para describir la cantidad y la moneda. Intentaron agregar dos campos a la value class, recibieron un error de compilación y pasaron algún tiempo tratando de eludir la limitación. Al final decidieron crear una data class separada.
Historia
Al integrar con una biblioteca Java externa, la inline class a veces se convertía en un objeto (boxing) de manera inesperada, lo que afectaba el rendimiento. Después de analizar la documentación, lo reemplazaron por un objeto de valor normal.
Historia
En un proyecto con microservicios, se utilizó value class como identificadores en la API. Uno de los servicios devolvía una cadena directamente, el otro — una value class, lo que llevó a un conflicto de serialización con Jackson. Se corrigió mediante un mapeo explícito entre el id y la cadena.