Java Academy · Lektion

permits-claussen

Angiv tilladte undertyper

Lektion 2 af 413 trin

permits-claussen er en gratis Java Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Java Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Java Academy-kurset indeholder 4 lektioner i alt.

permits-klausulen

permits-klausulen er den måde, en sealed-type angiver sine tilladte undertyper på. Den kommer lige efter typenavnet og nøgleordet permits.

Grundlæggende syntaks

Angiv de tilladte undertyper adskilt af kommaer efter permits.

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());
    }
}

Implementering af kontrakten

Hver navngiven undertype skal faktisk implements (for grænseflader) eller extends (for klasser) den sealed-type. Hvis du angiver en klasse i permits, som ikke gør det, er det en kompileringsfejl.

Udeladelse af permits

Hvis alle tilladte undertyper erklæres i den samme fil som sealed-typen, kan du helt udelade permits. Compileren udleder automatisk listen.

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());
    }
}

Når permits er påkrævet

Hvis undertyperne ligger i separate filer i den samme pakke eller det samme modul, skal du angive dem eksplicit i permits. Compileren kan ikke udlede dem på tværs af filer.

Rækkefølgen er ligegyldig

Rækkefølgen af navnene i permits har ingen semantisk betydning. Den påvirker hverken switchens opførsel eller noget andet; den er udelukkende en liste over tilladte typer.

Et klassehierarki med permits

Den samme klausul fungerer for sealed-klasser med abstrakt adfærd.

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());
    }
}

Glemt undertype

Hvis en klasse implementerer den sealed-grænseflade, men mangler i permits, mislykkes kompileringen med en meddelelse om, at klassen ikke må nedarve fra den sealed-type.

Tilladte typer er offentligt kendte

permits-listen er en del af typens kontrakt og registreres i klassefilen. Værktøjer og compileren kan læse den for at kende det komplette sæt af undertyper.

Blanding af final- og sealed-undertyper

En permits-liste kan blande modifikatorer: nogle undertyper er final, mens andre er sealed for at fortsætte hierarkiet i dybden.

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);
    }
}

Bedste praksis

Hold sealed-typen og dens undertyper tæt på hinanden af hensyn til læsbarheden. Foretræk at udelade permits for små hierarkier i én fil, og angiv det eksplicit, når filerne er opdelt.

Hurtigt tjek

Test din forståelse af permits-klausulen.

Opsummering

Du har lært permits-klausulen.

  • Den angiver de tilladte undertyper efter navnet på den sealed-type.
  • Hver angivet type skal nedarve fra eller implementere den sealed-type.
  • Den kan udelades, når alle undertyper deler den samme fil.
  • Undertyper kan selv være sealed og dermed udvide hierarkiet.
Gratis at komme i gang

Lær Java med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
104
Lektioner
374

Ofte stillede spørgsmål

Er lektionen “permits-claussen” gratis?

Ja — hele teksten til “permits-claussen” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Java Academy-kurset, skal du opgradere til CoddyKit PRO. Java Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “permits-claussen”?

Angiv tilladte undertyper Du øver dig i Java Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Java Academy?

Der kræves ingen tidligere erfaring. Java Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.

Hvor lang tid tager lektionen “permits-claussen”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Java Academy-lektion?

Ja. Alle Java Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Deklarering af sealed-typer
  2. permits-claussen
  3. Sealed med records
  4. Udtømmende switch på sealed-typer
← Tilbage til Java Academy