Wyczerpujący switch bez default
Kompilator weryfikuje, że wszystkie uszczelnione podtypy są obsłużone — nie trzeba default.
Porównanie kodu
✕ 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!
}
Widzisz problem z tym kodem? Daj nam znać.
Dlaczego nowoczesne podejście wygrywa
Bezpieczeństwo na etapie kompilacji
Dodaj nowy podtyp, a kompilator pokaże każde miejsce do zaktualizowania.
Brak martwego kodu
Żadnej nieosiągalnej gałęzi default, która maskuje błędy.
Typy algebraiczne
Sealed + rekordy + wyczerpujący switch = prawidłowe ADT w Javie.
Stare podejście
Obowiązkowy default
Nowoczesne podejście
Wyczerpywalność sealed
Od JDK
21
Poziom trudności
Średniozaawansowany
Wsparcie JDK
Wyczerpujący switch bez default
Dostępne
Szeroko dostępne od JDK 21 LTS (wrzesień 2023)
Jak to działa
Podczas przełączania po typie sealed kompilator zna wszystkie możliwe podtypy i weryfikuje, że każdy przypadek jest obsłużony. Jeśli dodasz nowy podtyp, kompilator oznaczy każdy switch, który jest teraz niekompletny.
Powiązana dokumentacja
Dowód