Geschichte der Frage:
Bis Java 12 wurde der switch-Befehl ausschließlich als Anweisung verwendet. Mit der Einführung von Java 12/14 kamen die switch-Ausdrücke (switch expression), die die Syntax und Funktionen des Befehls erweiterten. Switch-Ausdrücke sind für einen prägnanteren und ausdrucksvolleren Code gedacht.
Problem:
Der klassische switch führt oft zu Fehlern: Vergessen von break führt zu fall-through, die Lesbarkeit leidet bei vielen Fällen, es ist unmöglich, das Ergebnis direkt in der Anweisung zurückzugeben, und es fehlt eine umfassende Überprüfung der Werte.
Lösung:
Ein switch-Ausdruck kann einen Wert zurückgeben, die Pfeil-Syntax verwenden, eine umfassende Analyse zur Kompilierungszeit unterstützen und null über default verarbeiten. Die Syntax lautet:
String result = switch(day) { case MONDAY, FRIDAY -> "Arbeitstag"; case SATURDAY, SUNDAY -> "Wochenende"; default -> throw new IllegalArgumentException(); };
Wichtige Merkmale:
Kann switch mit enum, Strings und null arbeiten?
Mit enum funktioniert es seit Java 5. Mit Strings seit Java 7. Null wird nur über default verarbeitet, andernfalls gibt es eine NPE.
switch(day) { // day == null default: System.out.println("null"); } // funktioniert
Was passiert, wenn nicht alle Varianten des enums im switch-Ausdruck implementiert werden?
Der Compiler verlangt ein default oder eine Implementierung für alle Werte. Bei fehlendem wird ein Kompilierungsfehler auftreten.
Kann man break im neuen switch-Ausdruck verwenden?
Im Pfeilformat ist break nicht notwendig. Wenn man einen Block verwendet (case X -> { ... }), kann man yield verwenden, um einen Wert zurückzugeben:
int num = switch(x) { case 1 -> 10; case 2 -> { yield 20; } default -> 0; };
Klassischer switch mit int ohne break:
switch(type) { case 1: actionA(); case 2: actionB(); // wird sowohl bei type==1 als auch bei type==2 aufgerufen }
Vorteile:
Nachteile:
Verwendung des neuen switch-Ausdrucks zur Zuordnung von enum zu einem Ergebnis:
String status = switch(orderStatus) { case PAID -> "Bezahlt"; case CANCELED -> "Storniert"; default -> "In Bearbeitung"; };
Vorteile:
Nachteile: