switch-case ersetzt komplizierte Mehrfachverzweigungen

Mit Hilfe einer switch-case-Verzweigung können, ähnlich wie in einer if-else-Verzweigung, Werte überprüft und selektiv Anweisungen ausgeführt werden.

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.