Java Academy · Lektion

Patterns i switch

Kombinér sealed-typer og patterns

Lektion 4 af 413 trin

Patterns i switch er en gratis Java Academy-lektion på CoddyKit. Dette er lektion 4 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.

Mønstre i switch

Switch er gået fra at matche konstanter til at matche mønstre. Sammen med forseglede typer og records kan en switch vælge handling ud fra type, destrukturere data og garantere, at alle muligheder er dækket.

Typemønstre i switch

Hver case kan være et typemønster, der binder en variabel med den relevante type til den pågældende gren.

public class Main {
    static String kind(Object o) {
        return switch (o) {
            case Integer i -> "int " + i;
            case String s -> "string " + s;
            default -> "other";
        };
    }

    public static void main(String[] args) {
        System.out.println(kind(42));
        System.out.println(kind("hi"));
        System.out.println(kind(3.14));
    }
}

Forseglede typer kræver ikke default

Når vælgeren er en forseglet type, og du dækker alle tilladte undertyper, er switch komplet uden en default.

public class Main {
    sealed interface Shape permits Circle, Square {}
    record Circle(double r) implements Shape {}
    record Square(double s) implements Shape {}

    static double area(Shape shape) {
        return switch (shape) {
            case Circle c -> Math.PI * c.r() * c.r();
            case Square sq -> sq.s() * sq.s();
        };
    }

    public static void main(String[] args) {
        System.out.printf("%.2f%n", area(new Square(3)));
    }
}

Record-mønstre i cases

Cases kan destrukturere records, så komponenterne bliver direkte tilgængelige i grenens kodeblok.

public class Main {
    sealed interface Shape permits Circle, Rectangle {}
    record Circle(double r) implements Shape {}
    record Rectangle(double w, double h) implements Shape {}

    static double area(Shape shape) {
        return switch (shape) {
            case Circle(double r) -> Math.PI * r * r;
            case Rectangle(double w, double h) -> w * h;
        };
    }

    public static void main(String[] args) {
        System.out.printf("%.2f%n", area(new Rectangle(2, 5)));
    }
}

Vagter med when

En when-klausul tilføjer en boolesk vagtbetingelse til en case. Casen matcher kun, hvis mønsteret passer og vagten er sand.

public class Main {
    static String size(Object o) {
        return switch (o) {
            case Integer i when i < 0 -> "negative";
            case Integer i when i == 0 -> "zero";
            case Integer i -> "positive";
            default -> "not an int";
        };
    }

    public static void main(String[] args) {
        System.out.println(size(-5));
        System.out.println(size(0));
        System.out.println(size(7));
    }
}

Rækkefølgen er vigtig med vagter

Cases med vagter afprøves fra top til bund. En mere specifik case med vagt skal komme før en bredere case uden vagt, ellers vil den brede case opsluge den.

Håndtering af null

Tilføj case null for at håndtere en null-værdi; ellers kaster switch NullPointerException. Du kan endda kombinere dem som case null, default.

public class Main {
    static String label(String s) {
        return switch (s) {
            case null -> "missing";
            case "yes" -> "affirmative";
            default -> "other: " + s;
        };
    }

    public static void main(String[] args) {
        System.out.println(label(null));
        System.out.println(label("yes"));
        System.out.println(label("maybe"));
    }
}

Indlejrede mønstre i switch

Cases kan indlejre record-mønstre for at matche dybe strukturer og kontrollere indre værdier med en vagt på ét sted.

public class Main {
    record Point(int x, int y) {}
    record Line(Point a, Point b) {}

    static String describe(Object o) {
        return switch (o) {
            case Line(Point(var x1, var y1), Point(var x2, var y2)) when x1 == x2 -> "vertical";
            case Line(Point a, Point b) -> "line";
            default -> "other";
        };
    }

    public static void main(String[] args) {
        System.out.println(describe(new Line(new Point(1, 0), new Point(1, 5))));
        System.out.println(describe(new Line(new Point(0, 0), new Point(2, 3))));
    }
}

Sætninger og udtryk

Mønstermatchning i switch fungerer både som et udtryk, der frembringer en værdi med -> eller yield, og som en sætning. Reglerne for at dække alle muligheder gælder, når vælgeren er forseglet.

Erstat Visitor-kode

Forseglede typer og mønstermatchning i switch erstatter tilsammen omstændelige visitor-mønstre og lange instanceof-kæder med et kort, kompilatorkontrolleret valg af handlinger i en lukket model.

En komplet fortolker

En udtryksfortolker, der bruger en forseglet model og mønstermatchning i switch.

public class Main {
    sealed interface Expr permits Num, Add, Mul {}
    record Num(int value) implements Expr {}
    record Add(Expr left, Expr right) implements Expr {}
    record Mul(Expr left, Expr right) implements Expr {}

    static int eval(Expr e) {
        return switch (e) {
            case Num(int v) -> v;
            case Add(Expr l, Expr r) -> eval(l) + eval(r);
            case Mul(Expr l, Expr r) -> eval(l) * eval(r);
        };
    }

    public static void main(String[] args) {
        Expr e = new Add(new Num(2), new Mul(new Num(3), new Num(4)));
        System.out.println(eval(e));
    }
}

Hurtig kontrol

Test din forståelse af mønstre i switch.

Opsummering

Du har lært mønstre i switch.

  • Cases kan være typemønstre og record-mønstre med destrukturering.
  • Forseglede vælgere giver komplette switches uden default.
  • when-vagter præciserer cases; rækkefølgen er vigtig.
  • case null håndterer null sikkert.
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 “Patterns i switch” gratis?

Ja — hele teksten til “Patterns i switch” 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 “Patterns i switch”?

Kombinér sealed-typer og patterns 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 4 af 4.

Hvor lang tid tager lektionen “Patterns i switch”?

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. Pattern matching for instanceof
  2. Record patterns
  3. Indlejrede record patterns
  4. Patterns i switch
← Tilbage til Java Academy