Wyrażenie switch exhaustive dla sealed
Kompletność sprawdzana podczas kompilacji
Wyrażenie switch exhaustive dla sealed to bezpłatna lekcja Java Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Java Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Java Academy zawiera 4 lekcji w sumie.
Wyczerpujący switch
Gdy używasz switch dla typu sealed, kompilator zna każdy dozwolony podtyp. Jeśli switch obejmuje je wszystkie, jest wyczerpujący i nie potrzebujesz gałęzi default.
switch z wzorcem typu
Wyrażenia switch mogą dopasowywać się do typu środowiska uruchomieniowego wartości sealed za pomocą wzorców typów.
public class Main {
sealed interface Shape permits Circle, Square {}
record Circle(double radius) implements Shape {}
record Square(double side) implements Shape {}
static String describe(Shape s) {
return switch (s) {
case Circle c -> "circle r=" + c.radius();
case Square sq -> "square s=" + sq.side();
};
}
public static void main(String[] args) {
System.out.println(describe(new Circle(2)));
System.out.println(describe(new Square(3)));
}
}default nie jest potrzebny
Ponieważ Circle i Square są jedynymi dozwolonymi podtypami, kompilator uznaje switch za kompletny. Dodanie default byłoby zbędne.
Kompletność w czasie kompilacji
Jeśli później dodasz nowy dozwolony podtyp i zapomnisz go obsłużyć, każdy wyczerpujący switch nie skompiluje się. Cała kategoria błędów występujących w czasie działania zostaje w ten sposób zamieniona na błędy kompilacji.
Obliczanie wyniku
Wyczerpujące wyrażenia switch świetnie nadają się do przekształcania wartości w wynik, na przykład pole powierzchni.
public class Main {
sealed interface Shape permits Circle, Square {}
record Circle(double radius) implements Shape {}
record Square(double side) implements Shape {}
static double area(Shape s) {
return switch (s) {
case Circle c -> Math.PI * c.radius() * c.radius();
case Square sq -> sq.side() * sq.side();
};
}
public static void main(String[] args) {
System.out.printf("%.2f%n", area(new Circle(1)));
System.out.printf("%.2f%n", area(new Square(2)));
}
}Instrukcje switch a wyrażenia switch
Wyczerpywalność dotyczy wyrażeń switch (tych, które zwracają wartość) oraz instrukcji switch używających składni strzałkowej dla typu sealed. Kompilator wymusza pełne pokrycie przypadków.
Obsługa null
Domyślnie switch na referencji zgłasza NullPointerException, jeśli wartość jest null. Możesz dodać etykietę case null, aby jawnie obsłużyć ten przypadek.
public class Main {
sealed interface Shape permits Circle, Square {}
record Circle(double radius) implements Shape {}
record Square(double side) implements Shape {}
static String describe(Shape s) {
return switch (s) {
case null -> "no shape";
case Circle c -> "circle";
case Square sq -> "square";
};
}
public static void main(String[] args) {
System.out.println(describe(null));
System.out.println(describe(new Circle(1)));
}
}Warunki when nie naruszają kompletności
Możesz dodawać warunki when, aby doprecyzować przypadki, ale sam przypadek z warunkiem nie oznacza obsłużenia typu. Aby switch pozostał wyczerpujący, nadal potrzebujesz przypadku bez warunku dla każdego podtypu.
public class Main {
sealed interface Shape permits Circle, Square {}
record Circle(double radius) implements Shape {}
record Square(double side) implements Shape {}
static String size(Shape s) {
return switch (s) {
case Circle c when c.radius() > 10 -> "big circle";
case Circle c -> "small circle";
case Square sq -> "square";
};
}
public static void main(String[] args) {
System.out.println(size(new Circle(20)));
System.out.println(size(new Circle(2)));
}
}switch na klasie sealed
Ta sama zasada wyczerpywalności działa w przypadku klas sealed, nie tylko interfejsów.
public class Main {
sealed static abstract class Token permits Word, Number {}
static final class Word extends Token { final String text; Word(String t){text=t;} }
static final class Number extends Token { final int value; Number(int v){value=v;} }
static String show(Token t) {
return switch (t) {
case Word w -> "word:" + w.text;
case Number n -> "num:" + n.value;
};
}
public static void main(String[] args) {
System.out.println(show(new Word("hi")));
System.out.println(show(new Number(7)));
}
}Dlaczego to jest tak użyteczne
Wyczerpujący switch w połączeniu z typami sealed zapewnia bezpieczny kod, który można łatwo rozwijać. Zbiór przypadków jest opisany w jednym miejscu, a kompilator gwarantuje, że nie pominiesz żadnego z nich, gdy model się rozrośnie.
Kompletny przykład
W tym przykładzie typ wyniku sealed jest przekształcany w komunikat z pełnym uwzględnieniem wszystkich przypadków.
public class Main {
sealed interface Result permits Ok, Err {}
record Ok(int value) implements Result {}
record Err(String message) implements Result {}
static String render(Result r) {
return switch (r) {
case Ok ok -> "value = " + ok.value();
case Err err -> "error: " + err.message();
};
}
public static void main(String[] args) {
System.out.println(render(new Ok(10)));
System.out.println(render(new Err("bad input")));
}
}Szybki test
Sprawdź swoją wiedzę na temat wyczerpującego switch.
Podsumowanie
Zapoznałeś się z wyczerpującym switch dla typów sealed.
- Uwzględnienie wszystkich dozwolonych podtypów sprawia, że switch jest wyczerpujący, więc nie trzeba używać
default. - Pominięcie nowego podtypu staje się błędem kompilacji.
case nulljawnie obsługuje wartości null.- Warunki doprecyzowują przypadki, ale nie zastępują przypadku bez warunku.
Często zadawane pytania
Czy lekcja „Wyrażenie switch exhaustive dla sealed” jest bezpłatna?
Tak — pełny tekst „Wyrażenie switch exhaustive dla sealed” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Java Academy, przejdź na CoddyKit PRO. Kurs Java Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Wyrażenie switch exhaustive dla sealed”?
Kompletność sprawdzana podczas kompilacji Ćwiczysz Java Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Java Academy?
Nie wymagamy żadnego doświadczenia. Java Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Wyrażenie switch exhaustive dla sealed”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Java Academy?
Tak. Każda lekcja Java Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Deklarowanie typów sealed
- Klauzula permits
- sealed z rekordami
- Wyrażenie switch exhaustive dla sealed