Java Academy · leksjon

Mønstre i switch

Kombiner sealed-typer og mønstre

Leksjon 4 av 413 trinn

Mønstre i switch er en gratis leksjon i Java Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Java Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Java Academy inneholder totalt 4 leksjoner.

Mønstre i switch

Switch har utviklet seg fra å matche konstanter til å matche mønstre. Kombinert med sealed-typer og records kan en switch fordele behandlingen etter type, destrukturere data og garantere fullstendighet.

Typemønstre i switch

Hver case kan være et typemønster som binder en variabel med riktig type for den grenen.

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

Sealed-typer trenger ikke default

Når selektoren er en sealed-type og De dekker alle tillatte undertyper, er switch uttømmende uten 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 case-grener

Case-grener kan destrukturere records og gjøre komponentene direkte tilgjengelige i grenens kropp.

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

Guards med when

En when-klausul legger til en boolsk guard i en case. Casen matcher bare hvis mønsteret passer og guarden er sann.

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

Rekkefølgen er viktig med guards

Case-grener med guards prøves ovenfra og ned. En mer spesifikk case med guard må komme før en bredere case uten guard, ellers vil den brede casen fange den opp.

Håndtere null

Legg til case null for å håndtere en null-selektor; ellers kaster switch NullPointerException. De kan til og med kombinere dette 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"));
    }
}

Nestede mønstre i switch

Case-grener kan neste record-mønstre for å matche dype strukturer og kontrollere indre verdier på ett 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))));
    }
}

Setninger og uttrykk

Switch med mønstre fungerer både som et uttrykk (som gir en verdi med -> eller yield) og som en setning. Kravene til uttømming gjelder når selektoren er sealed.

Erstatte Visitor-kode

Til sammen erstatter sealed-typer og switch med mønstre ordrike Visitor-mønstre og instanceof-stiger med kortfattet, kompilatorkontrollert fordeling over en lukket modell.

En komplett tolk

En uttrykksevaluator som bruker en sealed-modell og en switch med mønstre.

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

Kort kontroll

Test forståelsen av mønstre i switch.

Oppsummering

De har lært om mønstre i switch.

  • Case-grener kan være typemønstre og record-mønstre med destrukturering.
  • Sealed-selektorer gir uttømmende switch-uttrykk uten default.
  • when-guards presiserer case-grener; rekkefølgen er viktig.
  • case null håndterer null på en trygg måte.
Gratis å komme i gang

Lær deg Java med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
104
Leksjoner
374

Ofte stilte spørsmål

Er leksjonen «Mønstre i switch» gratis?

Ja – hele teksten i «Mønstre i switch» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Java Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Java Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Mønstre i switch»?

Kombiner sealed-typer og mønstre Du øver på Java Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Java Academy?

Ingen tidligere erfaring er nødvendig. Java Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.

Hvor lang tid tar leksjonen «Mønstre i switch»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Java Academy-leksjonen?

Ja. Alle Java Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Mønstergjenkjenning for instanceof
  2. Record-mønstre
  3. Nestede record-mønstre
  4. Mønstre i switch
← Tilbake til Java Academy