0Pricing
Java Academy · Lekcja

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.

Wszystkie lekcje w tym kursie

  1. Deklarowanie typów sealed
  2. Klauzula permits
  3. sealed z rekordami
  4. Wyrażenie switch exhaustive dla sealed
← Powrót do Java Academy