Equivalencia desde Kotlin
Clases de valor
DirectaEl caso privado impide construir el valor sin pasar por create, igual que un constructor privado más una fábrica en Kotlin. create devuelve Option en vez de lanzar una excepción.
Referencia Kotlin: Declarar un tipo nominal para un dato primitivo y validar su invariante al construirse.
- Mecanismo
- Unión discriminada de un caso con constructor privado y una función create.
- Idea conservada
- El caso privado impide construir EvaluationBudget sin pasar por create, que valida el invariante antes de entregar el valor.
- Riesgo de diseño
- Quitar el modificador private del caso, permitiendo construir EvaluationBudget directamente sin pasar por create.
- Recomendación
- Declara el caso como private y expón solo create devolviendo Option para dejar explícita la posibilidad de fallo.
- Convención del curso
- Expón únicamente la función create; nunca el caso constructor por sí mismo.
- Mecanismo del lenguaje
- Unión discriminada de un caso con constructor privado.
Diferencias relevantes
- create devuelve Option en vez de lanzar una excepción.
- El caso sigue siendo una unión discriminada de un caso, no un value class con borrado garantizado en todos los escenarios.
create es la única forma pública de obtener un EvaluationBudget.
@JvmInline
value class EvaluationBudget(val remaining: Int) {
init {
require(remaining > 0) { "El presupuesto debe ser positivo." }
}
}
val budget = EvaluationBudget(1000) // remaining = 1000type EvaluationBudget = private EvaluationBudget of int
module EvaluationBudget =
let create remaining =
if remaining > 0 then Some (EvaluationBudget remaining) else None
let budget = EvaluationBudget.create 1000 // Some (EvaluationBudget 1000)