permits-claussen
Angiv tilladte undertyper
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.
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.