Klauzula permits
Lista dozwolonych podtypów
Klauzula permits to bezpłatna lekcja Java Academy na CoddyKit. To lekcja 2 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.
Klauzula permits
Klauzula permits służy typowi sealed do określenia jego dozwolonych podtypów. Występuje bezpośrednio po nazwie typu i słowie kluczowym permits.
Podstawowa składnia
Po słowie permits wymień dozwolone podtypy, oddzielając je przecinkami.
public class Main {
sealed interface Vehicle permits Car, Truck, Motorcycle {}
record Car() implements Vehicle {}
record Truck() implements Vehicle {}
record Motorcycle() implements Vehicle {}
public static void main(String[] args) {
Vehicle v = new Truck();
System.out.println(v.getClass().getSimpleName());
}
}Implementowanie kontraktu
Każdy nazwany podtyp musi faktycznie implements (w przypadku interfejsów) lub extends (w przypadku klas) typ sealed. Wymienienie w permits klasy, która tego nie robi, jest błędem kompilacji.
Pomijanie permits
Jeśli wszystkie dozwolone podtypy są zadeklarowane w tym samym pliku co typ sealed, możesz całkowicie pominąć permits. Kompilator automatycznie wywnioskuje listę.
public class Main {
sealed interface Status {}
record Active() implements Status {}
record Inactive() implements Status {}
public static void main(String[] args) {
Status s = new Active();
System.out.println(s.getClass().getSimpleName());
}
}Kiedy wymagane jest permits
Jeśli podtypy znajdują się w osobnych plikach w tym samym pakiecie lub module, musisz jawnie wymienić je w permits. Kompilator nie może wywnioskować listy na podstawie wielu plików.
Kolejność nie ma znaczenia
Kolejność nazw w permits nie ma znaczenia semantycznego. Nie wpływa na działanie switch ani na nic innego — jest wyłącznie listą dozwolonych typów.
Hierarchia klas z permits
Ta sama klauzula działa w przypadku klas sealed z abstrakcyjnym zachowaniem.
public class Main {
sealed static abstract class Node permits Leaf, Branch {
abstract int size();
}
static final class Leaf extends Node {
int size() { return 1; }
}
static final class Branch extends Node {
final Node a, b;
Branch(Node a, Node b) { this.a = a; this.b = b; }
int size() { return a.size() + b.size(); }
}
public static void main(String[] args) {
Node tree = new Branch(new Leaf(), new Branch(new Leaf(), new Leaf()));
System.out.println("Leaves: " + tree.size());
}
}Pominięcie podtypu
Jeśli klasa implementuje interfejs sealed, ale brakuje jej w permits, kompilacja kończy się niepowodzeniem z komunikatem informującym, że klasa nie może rozszerzać typu sealed.
Dozwolone typy są publicznie znane
Lista permits jest częścią kontraktu typu i jest zapisywana w pliku klasy. Narzędzia oraz kompilator mogą ją odczytać, aby poznać pełny zbiór podtypów.
Łączenie podtypów final i sealed
Lista permits może łączyć różne modyfikatory: niektóre podtypy mogą być final, a inne sealed, aby kontynuować hierarchię na kolejnych poziomach.
public class Main {
sealed interface Shape permits Circle, Polygon {}
record Circle(double r) implements Shape {}
sealed interface Polygon extends Shape permits Triangle, Rectangle {}
record Triangle() implements Polygon {}
record Rectangle() implements Polygon {}
public static void main(String[] args) {
Shape s = new Triangle();
System.out.println(s instanceof Polygon);
}
}Dobre praktyki
Dla czytelności trzymaj typ sealed i jego podtypy blisko siebie. W małych hierarchiach znajdujących się w jednym pliku preferuj pomijanie permits, a gdy kod jest podzielony na pliki, wymieniaj podtypy jawnie.
Szybki test
Sprawdź swoją wiedzę na temat klauzuli permits.
Podsumowanie
Zapoznałeś się z klauzulą permits.
- Wymienia ona dozwolone podtypy po nazwie typu sealed.
- Każdy wymieniony typ musi rozszerzać typ sealed lub go implementować.
- Można ją pominąć, gdy wszystkie podtypy znajdują się w tym samym pliku.
- Podtypy mogą same być sealed, aby rozwijać hierarchię.
Często zadawane pytania
Czy lekcja „Klauzula permits” jest bezpłatna?
Tak — pełny tekst „Klauzula permits” 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 „Klauzula permits”?
Lista dozwolonych podtypów Ć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 2 z 4.
Ile czasu zajmuje lekcja „Klauzula permits”?
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.