switch exhaustivo sin default
El compilador verifica que todos los subtipos sealed están cubiertos — no se necesita default.
Comparación de Código
✕ Java 8
// Must add default even though
// all cases are covered
double area(Shape s) {
if (s instanceof Circle c)
return Math.PI * c.r() * c.r();
else if (s instanceof Rect r)
return r.w() * r.h();
else throw new IAE();
}
✓ Java 21+
// sealed Shape permits Circle, Rect
double area(Shape s) {
return switch (s) {
case Circle c ->
Math.PI * c.r() * c.r();
case Rect r ->
r.w() * r.h();
}; // no default needed!
}
¿Ves un problema con este código? Cuéntanos.
Por qué gana la forma moderna
Seguridad en compilación
Añade un nuevo subtipo y el compilador te muestra cada lugar que necesita actualizarse.
Sin código muerto
Sin rama default inalcanzable que oculte errores.
Tipos algebraicos
sealed + records + switch exhaustivo = ADTs completos en Java.
Enfoque Antiguo
default obligatorio
Enfoque Moderno
Exhaustividad con sealed
Desde JDK
21
Dificultad
Intermedio
Soporte JDK
switch exhaustivo sin default
Disponible
Ampliamente disponible desde JDK 21 LTS (sept. 2023)
Cómo funciona
Al hacer switch sobre un tipo sealed, el compilador conoce todos los subtipos posibles y verifica que cada caso esté cubierto. Si añades un nuevo subtipo, el compilador señala cada switch que queda incompleto.
Documentación Relacionada