Java Academy · Les

Patronen in switch

Sealed typen en patronen combineren

Les 4 van 413 stappen

Patronen in switch is een gratis Java Academy-les op CoddyKit. Dit is les 4 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Java Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Java Academy bevat in totaal 4 lessen.

Patronen in switch

Switch is geëvolueerd van het matchen van constanten naar het matchen van patronen. In combinatie met sealed typen en records kan een switch op type verdelen, gegevens destructureren en volledigheid garanderen.

Typepatronen in switch

Elke case kan een typepatroon zijn en voor die vertakking een getypeerde variabele koppelen.

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

Voor sealed typen is geen default nodig

Wanneer de selectie-expressie een sealed type is en je elk toegestaan subtype afdekt, is de switch uitputtend zonder een 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)));
    }
}

Recordpatronen in cases

Cases kunnen records destructureren, zodat de componenten rechtstreeks beschikbaar zijn in de body van de vertakking.

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

Bewakingen met when

Een when-clausule voegt een booleaanse bewaking toe aan een case. De case matcht alleen als het patroon past en de bewaking waar is.

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

De volgorde van bewakingen is belangrijk

Cases met bewakingen worden van boven naar beneden geprobeerd. Een specifiekere case met bewaking moet vóór een bredere case zonder bewaking komen, anders zou de brede case de specifieke case onderscheppen.

null afhandelen

Voeg case null toe om een null-selectie te verwerken; anders werpt de switch NullPointerException. Je kunt die zelfs combineren als 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"));
    }
}

Geneste patronen in switch

Cases kunnen geneste recordpatronen bevatten om diepe structuren te matchen en op binnenste waarden te bewaken.

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

Instructies en expressies

Een patroonswitch werkt zowel als expressie, die met -> of yield een waarde oplevert, als als instructie. De regels voor volledigheid gelden wanneer de selectie sealed is.

Visitor-code vervangen

Samen vervangen sealed typen en pattern switch uitgebreide Visitor-patronen en instanceof-ladders door beknopte, door de compiler gecontroleerde typeverdeling over een gesloten model.

Een volledige interpreter

Een expressie-evaluator die een sealed model en een patroonswitch gebruikt.

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

Korte controle

Test je begrip van patronen in switch.

Samenvatting

Je hebt patronen in switch geleerd.

  • Cases kunnen typepatronen en recordpatronen zijn, met destructurering.
  • Sealed selecties leveren uitputtende switches zonder default.
  • when-bewakingen verfijnen cases; de volgorde is belangrijk.
  • case null handelt null veilig af.
Gratis beginnen

Leer Java met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
104
Lessen
374

Veelgestelde vragen

Is de les “Patronen in switch” gratis?

Ja — de volledige tekst van “Patronen in switch” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Java Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Java Academy bevat in totaal 4 lessen.

Wat leer ik in “Patronen in switch”?

Sealed typen en patronen combineren Je oefent met Java Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Java Academy te beginnen?

Ervaring vooraf is niet nodig. Java Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 4 van 4.

Hoe lang duurt de les “Patronen in switch”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Java Academy?

Ja. Elke les over Java Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Pattern matching voor instanceof
  2. Recordpatronen
  3. Geneste recordpatronen
  4. Patronen in switch
← Terug naar Java Academy