Language Średniozaawansowany

Kompilator weryfikuje, że wszystkie uszczelnione podtypy są obsłużone — nie trzeba default.

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

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
Wyczerpujący switch bez default
Dostępne

Szeroko dostępne od JDK 21 LTS (wrzesień 2023)

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.