Wenn Sie Code mit vielen Bedingungen schreiben, haben Sie sicherlich entweder eine if-else- oder eine switch- Anweisung verwendet. Aber diese Alternative zum if-else hat Nachteile. Einige Leute haben die switch- Anweisung sogar als „Anti-Pattern“ bezeichnet .

Was ist das? Ein Anti-Pattern ist ein häufiges Muster für fehlerhaften Code, also eine schlechte Lösung eines Problems. Programmierer versuchen, sie im Code zu vermeiden, da sie die Codequalität beeinträchtigen.

Aber es gibt eine gute Nachricht: Neue Versionen von Java haben viele Änderungen in der Syntax der Sprache mit sich gebracht, und eine dieser Änderungen betrifft switch . Fasziniert? Dann lasst uns eintauchen.

Zunächst lohnt es sich zu klären, warum Switch ein Anti-Pattern ist. Betrachten Sie den folgenden Code:


switch (condition) {
    case "DECEMBER":
        seasonNumber = 1;
        break;
    case "JANUARY":
        seasonNumber = 1;
        break;
    case "FEBRUARY":
        seasonNumber = 1;
        break;
    default:
        seasonNumber = 0;
}

Okay, es ist also noch nicht ganz klar, warum es sich hierbei um ein „Anti-Pattern“ handelt.

Was aber, wenn wir weitere Case- Blöcke hinzufügen und der Code nun so aussieht:


switch (condition) {
    case "DECEMBER":
        seasonNumber = 1;
        break;
    case "JANUARY":
        seasonNumber = 1;
        break;
    case "FEBRUARY":
        seasonNumber = 1;
        break;
    case “MARCH”:
        seasonNumber = 2;
        break;
    case “APRIL”:
        seasonNumber = 2;
        break;
    case “MAY”:
        seasonNumber = 2;
        break;
    default:
        seasonNumber = 0;
}

Fügen wir noch ein paar Zeilen hinzu – der Code wird länger. Später können wir immer mehr Zeilen hinzufügen, und niemand wird uns daran hindern.

Das ist der Kern des Problems: Nachdem wir zunächst eine kompakte Switch- Anweisung erstellt haben, fügen wir ihr immer mehr Code hinzu, der immer mehr Platz einnimmt – mehr als auf den Bildschirm passt – und das Lesen und Verwalten des Codes erschwert.

Unterschied zwischen der Switch-Anweisung und dem Switch-Ausdruck

Mit Java 14 wurde ein neuer und verbesserter Schalter eingeführt. Es handelt sich nicht um eine Switch-Anweisung , sondern um einen Switch-Ausdruck .

Was ist der Unterschied, fragen Sie? Der Unterschied besteht darin, dass eine Anweisung eine Anweisung ist, die eine bestimmte Reihe von Operationen ausführt, während ein Ausdruck ein Codeabschnitt ist, der eine Berechnung durchführt und ein Ergebnis zurückgibt.

Mit anderen Worten: Jetzt können Sie das Ergebnis eines Wechsels in einer Variablen speichern.

Genug geredet. Schauen wir uns nun an, wie der neue Schalter aussieht:


var result = switch(month) {
     case DECEMBER, JANUARY, FEBRUARY -> 1;
     case MARCH, APRIL, MAY -> 2;
    case JUNE, JULY, AUGUST -> 3;
    case SEPTEMBER, OCTOBER, NOVEMBER -> 4;
    default -> 0; 
};

Das erste, was ins Auge fällt, ist die Kompaktheit des Codes. Code, der früher den größten Teil des Bildschirms einnahm, erstreckt sich jetzt über einige Zeilen und sieht viel besser lesbar aus.

-> Betreiber

Beachten Sie auch den ->- Operator (Pfeiloperator). Wenn Sie Erfahrung mit Lambda-Ausdrücken haben, sind Sie möglicherweise bereits damit vertraut.

Das bedeutet, dass Sie jetzt einen cool aussehenden Schalter im Stil einer Lambda-Anweisung schreiben können. Der Pfeiloperator gibt an, dass der Compiler nicht mit dem nächsten Case- Ausdruck fortfährt (wenn im aktuellen Case- Block keine Break- oder Return- Anweisung vorhanden ist), sondern Ihnen stattdessen den Wert des Ausdrucks rechts vom Pfeil liefert.

Sie können auch Code schreiben, der kein Ausdruck ist und einfach bestimmte Aktionen ausführt, anstatt etwas zurückzugeben:


switch(condition) {
    case TRUE, FALSE -> System.out.println("True/false");
  
    default -> System.out.println("Another");
}

Beachten Sie, dass switch keine break- Anweisung mehr hat. Es wurde in Java 13 entfernt und durch yield ersetzt .

Was ist Ertrag und wo kann er eingesetzt werden?

Wenn ein Schalter aus einer einzelnen Zeile besteht, gibt der ->- Operator selbst den Wert zurück. Was aber, wenn wir nicht eine, sondern viele Codezeilen haben? In solchen Fällen gibt der Pfeiloperator keinen Wert zurück, da es sich um mehrere Zeilen und nicht um eine handelt.

Vielleicht können wir return verwenden ? Schließlich wird es in Java verwendet, um Werte zurückzugeben. Leider nein, die Rückkehr funktioniert mit einem Schalter nicht. Was können wir also verwenden? Früher gab es break , aber das wurde in Java 13 entfernt. Aber an seiner Stelle haben wir jetzt yield – ein neues Schlüsselwort, das Ihnen hilft, einen Wert von einem Schalter zurückzugeben. Es ist analog zu Return- Anweisungen in Methoden.


var result = switch(condition) {
//…
case "Hi" -> "greeting"
//…
};  

Dieser Code enthält eine einzelne Zeile und der ->- Operator gibt „gruss“ zurück.

Aber wenn wir einen Codeblock haben:


var result = switch(condition) {
//…
case "Hi" -> {
// Your code
 Here you need to return "greeting"
	}
};  

Das Schlüsselwort, das Ihnen bei der Rückgabe eines Werts hilft, ist yield :


var result = switch(condition) {
//…
case "Hi" -> {
// Your code
 yield "greeting";

	}
};

yield wurde in Java 13 für Fälle hinzugefügt, in denen wir mehr als eine Codezeile in einem Case-Block haben und ein Ergebnis zurückgeben müssen.

Wahrscheinlich möchten Sie den neuen Schalter in Ihrem Code unbedingt ausprobieren , denken Sie jedoch daran, dass Sie dafür Java 14 oder höher benötigen. Bei früheren Versionen ist dieser Schalter nur verfügbar, wenn Sie das Flag „--enable-preview“ in der Befehlszeile angeben, da er vor Version 14 Teil der technischen Vorschau und kein vollwertiger Teil der Sprache war.

Das ist alles für jetzt! Mach's gut!