Language Fortgeschritten

Der Compiler prüft, dass alle versiegelten Untertypen abgedeckt sind – kein default erforderlich.

✕ 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!
}
Problem mit diesem Code entdeckt? Sag uns Bescheid.

Compile-Zeit-Sicherheit

Einen neuen Untertyp hinzufügen und der Compiler zeigt jeden Ort, der aktualisiert werden muss.

🚫

Kein toter Code

Kein unerreichbarer default-Zweig, der Fehler verbirgt.

📐

Algebraische Typen

Sealed + Records + erschöpfendem Switch = echte ADTs in Java.

Alter Ansatz
Obligatorischer default-Zweig
Moderner Ansatz
Sealed Exhaustiveness
Seit JDK
21
Schwierigkeitsgrad
Fortgeschritten
Erschöpfender Switch ohne default
Verfügbar

Seit JDK 21 LTS allgemein verfügbar (Sept. 2023)

Beim Switch über einen sealed-Typ kennt der Compiler alle möglichen Untertypen und verifiziert, dass jeder Fall behandelt wird. Wird ein neuer Untertyp hinzugefügt, markiert der Compiler jeden Switch, der nun unvollständig ist.

Teilen 𝕏 🦋 in