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