switch exhaustif sans default
Le compilateur vérifie que tous les sous-types sealed sont couverts — pas de default nécessaire.
Comparaison de Code
✕ 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!
}
Un problème avec ce code ? Dites-le nous.
Pourquoi la méthode moderne gagne
Sécurité à la compilation
Ajoutez un nouveau sous-type et le compilateur vous montre chaque endroit qui doit être mis à jour.
Sans code mort
Sans branche default inaccessible qui cache des erreurs.
Types algébriques
sealed + records + switch exhaustif = ADTs complets en Java.
Ancienne Approche
default obligatoire
Approche Moderne
Exhaustivité avec sealed
Depuis JDK
21
Difficulté
Intermédiaire
Support JDK
switch exhaustif sans default
Disponible
Disponible depuis JDK 21 LTS (sept. 2023)
Comment ça fonctionne
En faisant un switch sur un type sealed, le compilateur connaît tous les sous-types possibles et vérifie que chaque cas est couvert. Si vous ajoutez un nouveau sous-type, le compilateur signale chaque switch incomplet.
Documentation Associée