Language Intermédiaire

Le compilateur vérifie que tous les sous-types sealed sont couverts — pas de default nécessaire.

✕ 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.

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
switch exhaustif sans default
Disponible

Disponible depuis JDK 21 LTS (sept. 2023)

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.

Partager 𝕏 🦋 in