ProgramaciónDesarrollador Backend

¿Qué es una 'inline class' (value class) en Kotlin? ¿Para qué sirven, cómo se deben utilizar correctamente, qué limitaciones y características tienen dichas clases? Proporcione ejemplos de código.

Supere entrevistas con el asistente de IA Hintsage

Respuesta

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) }
  • Solo se permite una propiedad (campo principal).
  • No se permite un constructor sin argumentos.
  • La clase no puede contener estado (por ejemplo, campos var), solo val.
  • No se puede heredar de otras clases, pero se pueden implementar interfaces.
  • La interacción con código Java puede ser poco clara — puede ocurrir boxing/unboxing.

El uso de inline/value classes es importante para la tipificación de identificadores, dinero, unidades de medida, etc.

Pregunta capciosa

¿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

Ejemplos de errores reales debido al desconocimiento de los matices del tema


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.