Equivalencia desde Kotlin
Clases de valor
CercanaUn record de un componente separa EvaluationBudget de un int en tiempo de compilación y valida el invariante en su constructor compacto. A diferencia de Kotlin, la JVM siempre asigna una instancia de este record.
Referencia Kotlin: Declarar un tipo nominal para un dato primitivo y validar su invariante al construirse.
- Mecanismo
- record de un componente con validación en el constructor compacto.
- Idea conservada
- El tipo distingue EvaluationBudget de int en tiempo de compilación y rechaza valores no positivos al construirse.
- Riesgo de diseño
- Suponer que un record de un componente se representa igual que un int en tiempo de ejecución, cuando siempre existe una instancia asignada.
- Recomendación
- Usa un record de un componente cuando el dominio necesite distinguir EvaluationBudget de int, sin prometer una representación sin asignación.
- Convención del curso
- Valida el invariante en el constructor compacto, no en un método aparte.
- Mecanismo del lenguaje
- record con un constructor compacto para validar.
Diferencias relevantes
- Kotlin puede evitar la asignación del wrapper en tiempo de ejecución bajo ciertas condiciones; un record de Java siempre asigna una instancia.
- Ambos son inmutables y comparan por valor, no por identidad.
El constructor compacto rechaza un presupuesto no positivo.
@JvmInline
value class EvaluationBudget(val remaining: Int) {
init {
require(remaining > 0) { "El presupuesto debe ser positivo." }
}
}
val budget = EvaluationBudget(1000) // remaining = 1000record EvaluationBudget(int remaining) {
EvaluationBudget {
if (remaining <= 0) throw new IllegalArgumentException("El presupuesto debe ser positivo.");
}
}
var budget = new EvaluationBudget(1000); // remaining = 1000