Erschöpfender Switch ohne default
Der Compiler prüft, dass alle versiegelten Untertypen abgedeckt sind – kein default erforderlich.
Code-Vergleich
✕ 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.
Warum der moderne Weg gewinnt
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
JDK-Unterstützung
Erschöpfender Switch ohne default
Verfügbar
Seit JDK 21 LTS allgemein verfügbar (Sept. 2023)
Wie es funktioniert
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.
Zugehörige Dokumentation
Beweis