Equivalencia desde Kotlin
Clases de valor
DirectaUn opaque type es distinto de Int solo para el verificador de tipos; se borra en tiempo de ejecución, igual que ocurre habitualmente con un value class de Kotlin. La validación vive en el apply del companion object.
Referencia Kotlin: Declarar un tipo nominal para un dato primitivo y validar su invariante al construirse.
- Mecanismo
- opaque type con validación en el apply del companion object.
- Idea conservada
- El tipo es distinto de Int solo en tiempo de compilación y se borra en tiempo de ejecución, sin costo de asignación adicional.
- Riesgo de diseño
- Olvidar que, fuera del archivo donde se declara el opaque type, el compilador no permite operar con el Int subyacente directamente.
- Recomendación
- Usa opaque type cuando el valor deba comportarse como un Int en tiempo de ejecución sin costo adicional.
- Convención del curso
- Valida el invariante en el apply del companion object.
- Mecanismo del lenguaje
- opaque type.
Diferencias relevantes
- opaque type no permite añadir estado adicional al valor subyacente, a diferencia de un value class con más de una propiedad lógica.
- La validación vive en el apply del companion object, no en un bloque init como en Kotlin.
apply valida el invariante antes de exponer el valor opaco.
@JvmInline
value class EvaluationBudget(val remaining: Int) {
init {
require(remaining > 0) { "El presupuesto debe ser positivo." }
}
}
val budget = EvaluationBudget(1000) // remaining = 1000opaque type EvaluationBudget = Int
object EvaluationBudget:
def apply(remaining: Int): EvaluationBudget =
require(remaining > 0, "El presupuesto debe ser positivo.")
remaining
val budget = EvaluationBudget(1000) // 1000