switch-case ersetzt komplizierte Mehrfachverzweigungen
Die Verzweigung kann primitive byte-, short-,
char-
und int
-Werte, jedoch
keine long, float
oder gar Objekte
prüfen. Zudem kann auch auf Enumerations
und Strings
geprüft werden. Die switch-case-Verzweigung
entspricht einer Mehrfachverzweigung mit if
.
Der Wert hinter dem switch
wird
nacheinander mit den hinter der Sprungmarke case
aufgeführten Werten verglichen. Bei
Übereinstimung wird die jeweilige, dort notierte
Anweisung ausgeführt. Trifft keine
Übereinstimmung zu, kann optional mit der
Sprungmarke default
eine Standardanweisung
ausgeführt werden.
public class SwitchCaseClass {
public static void main(String[] args){
int i=2;
switch(i){
case 0:
System.out.println("i ist null");
break;
case 1:
System.out.println("i ist eins");
break;
case 2:
System.out.println("i ist zwei");
break;
case 3:
System.out.println("i ist drei");
break;
default:
System.out.println("i liegt nicht zwischen null und drei");
break;
}
}
}
Es ist wichtig darauf zu achten, dass nach
Ausführung einer Anweisung der Schleifendurchlauf
mit break unterbrochen wird, da die folgenden
Sprungmarken sonst ebenfalls geprüft und die dort
vorhandenen Anweisungen ggf. ausgeführt werden.
Das
letzte break
im Quelltext nach dem default
-Statement
ist nicht zwingend erforderlich, wird jedoch von Oracle
empfohlen1, um die
Fehleranfälligkeit des Codes zu reduzieren.
Mit der Java-Version 1.7 wurde die Möglichkeit eingeführt, auch auf Strings zu prüfen. Ein Beispiel sieht wie folgt aus:
String s = "Hundefutter"; switch (s) { case "Marmelade": System.out.println("Prima zum Frühstück"); break; case "Pizza": System.out.println("Immer wieder gerne"); break; case "Hundefutter": System.out.println("Pfui Teufel"); break; default: System.out.println("Keinen Hunger?"); break; }
An dieser Stelle sei auf einen häufigen Fehler hingewiesen:
int i = 24; switch (i) { case i>12: // Fehler System.out.println(i); break; default: break; }
Den Wert von i dann auszugeben, wenn er höher als
12 ist gelingt nicht, da es sich bei i>12
um einen boolschen Ausdruck handelt, auf den nicht
gefiltert werden kann!
Multiple case-Statements
Mehrere case
-Statements können auch
gruppiert werden. Dies muss bis Java 11 auf die folgende
Weise erfolgen, was letztlich mehreren Sprungmarken mit
fehlenden Anweisungen entspricht. Man beachte den
Doppelpunkt nach jedem case
-Statement!
int i = 24; switch (i) { case 0: case 24: case 13: System.out.println(i); break; default: break; }
v.12 Ab Java 122 lässt sich dies
etwas vereinfachen, indem hinter den case
-Sprungmarken
die Werte als Komma-separierte Liste notiert werden. Als
Beispiel hier die zeitabhängige Ausgabe einer
Grußformel. Auch hier muss wieder jedes case
-Statement
mit break
beendet werden.
int hour = LocalDateTime.now().getHour(); switch (hour) { case 22, 23, 0, 1, 2, 3, 4: System.out.println("Gute Nacht!"); break; case 5, 6, 7, 8, 9, 10: System.out.println("Guten Morgen!"); break; case 18, 19, 20, 21: System.out.println("Guten Abend!"); break; default: System.out.println("Guten Tag!"); break; }
Switch-Ausdrücke
Mit Java 12 werden sog. switch-Ausdrücke zunächst als Preview Features eingeführt. Sie liefern einen Rückgabewert, was die Verwendung der Verzweigung nochmals vereinfacht.
int hour = LocalDateTime.now().getHour(); String gruss = switch (hour) { case 22, 23, 0, 1, 2, 3, 4 -> "Gute Nacht!"; case 5, 6, 7, 8, 9, 10 -> "Guten Morgen!"; case 18, 19, 20, 21 -> "Guten Abend!"; default -> "Guten Tag!"; }; System.out.println(gruss);
Jede case-Sprungmarke filtert hier wie oben auf mehrere Komma-separierte Werte. Das Ergebnis wird jedoch durch den Pfeiloperator und ohne Doppelpunkt einer Variablen zugewiesen. Die break-Anweisungen fallen weg.
v.13 Mit Java 13 werden die
Möglichkeiten nochmals erweitert. Das
Schlüsselwort yield
wird zunächst
als Preview
Feature eingeführt und dann in Java 14
endgültig übernommen. Es liefert die
Rückgabe auf den gefilterten Wert und ersetzt die
nur vorübergehend erlaubte und deshalb hier nicht
vorgestellte Rückgabe eines Wertes durch break
.
Man beachte hier wiederum die notwendige Verwendung des
Doppelpunktes!
int hour = LocalDateTime.now().getHour(); String gruss = switch (hour) { case 22, 23, 0, 1, 2, 3, 4: yield "Gute Nacht!"; case 5, 6, 7, 8, 9, 10: yield "Guten Morgen!"; case 18, 19, 20, 21: yield "Guten Abend!"; default: yield "Guten Tag!"; }; System.out.println(gruss);
1)
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html
2) In Java 12 wurden diese
Vereinfachnungen von Oracle als Preview
Feature eingeführt, die in Java 14
endgültig ins JDK übernommen wurden.
Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.