Switch esaustivo senza default
Il compilatore verifica che tutti i sottotipi sealed siano coperti — nessun default necessario.
Confronto Codice
✕ 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!
}
Vedi un problema con questo codice? Faccelo sapere.
Perché vince l'approccio moderno
Sicurezza in fase di compilazione
Aggiungi un nuovo sottotipo e il compilatore mostra ogni punto da aggiornare.
Nessun codice morto
Nessun ramo default irraggiungibile che maschera i bug.
Tipi algebrici
Sealed + record + switch esaustivo = ADT propri in Java.
Approccio Vecchio
Default obbligatorio
Approccio Moderno
Esaustività sealed
Dal JDK
21
Difficoltà
Intermedio
Supporto JDK
Switch esaustivo senza default
Disponibile
Ampiamente disponibile dal JDK 21 LTS (settembre 2023)
Come funziona
Quando si usa lo switch su un tipo sealed, il compilatore conosce tutti i possibili sottotipi e verifica che ogni caso sia gestito. Se aggiungi un nuovo sottotipo, il compilatore segnala ogni switch ora incompleto.
Documentazione Correlata