Java Switch-Anweisung

Java Switch-Anweisung

1. Überblick

In diesem Tutorial erfahren Sie, wie die Anweisungswitchlautet und wie sie verwendet wird.

Mit der Anweisungswitch können wir mehrere verschachtelteif-else-Konstrukte ersetzen und so die Lesbarkeit unseres Codes verbessern.

Switch hat sich im Laufe der Zeit weiterentwickelt - neue unterstützte Typen wurden hinzugefügt, insbesondere in Java 5 und 7. Außerdem entwickelt es sich weiter -switch Ausdrücke werden wahrscheinlich in Java 12 eingeführt.

Im Folgenden werden einige Codebeispiele aufgeführt, um die Verwendung der Anweisungswitch, die Rolle der Anweisungbreak, die Anforderungen für das Argumentswitch/ die Wertecaseund zu demonstrieren der Vergleich vonStrings ina switch Aussage.

Fahren wir mit dem Beispiel fort.

2. Anwendungsbeispiel

Nehmen wir an, wir haben die folgenden verschachteltenif-else-Anweisungen:

public String exampleOfIF(String animal) {
    String result;
    if (animal.equals("DOG") || animal.equals("CAT")) {
        result = "domestic animal";
    } else if (animal.equals("TIGER")) {
        result = "wild animal";
    } else {
        result = "unknown animal";
    }
    return result;
}

Der obige Code sieht nicht gut aus und ist schwer zu pflegen und zu begründen. Um die Lesbarkeit zu verbessern, können wir hier die Anweisungswitchverwenden:

public String exampleOfSwitch(String animal) {
    String result;
    switch (animal) {
        case "DOG":
            result = "domestic animal";
            break;
        case "CAT":
            result = "domestic animal";
            break;
        case "TIGER":
            result = "wild animal";
            break;
        default:
            result = "unknown animal";
            break;
    }
    return result;
}

Wie oben gezeigt, vergleichen wir dasswitch Argumentanimal mit den verschiedenencase Werten. Wenn keiner dercase-Werte dem Argument entspricht, wird der Block unter der Bezeichnungdefault ausgeführt.

Einfach ausgedrückt wird die Anweisungbreakverwendet, um die Anweisungswitchzu beenden.

3. Diebreak-Anweisung

Obwohl die meisten Anweisungen vonswitchim wirklichen Leben implizieren, dass nur einer der Blöcke voncaseausgeführt werden sollte, ist die Anweisung vonthe breakerforderlich, umswitch nach Abschluss des Blocks zu beenden.

Wenn wir vergessen,break zu schreiben, werden die darunter liegenden Blöcke ausgeführt.

Um dies zu demonstrieren, lassen wir die Anweisungen vonbreakweg und fügen die Ausgabe für jeden Block zur Konsole hinzu:

public String forgetBreakInSwitch(String animal) {
    switch (animal) {
    case "DOG":
        System.out.println("domestic animal");
    default:
        System.out.println("unknown animal");
    }
}

Führen Sie diesen CodeforgetBreakInSwitch (“DOG”), aus und überprüfen Sie die Ausgabe, um zu beweisen, dass alle Blöcke ausgeführt werden:

domestic animal
unknown animal

Wir sollten also vorsichtig sein und am Ende jedes Blocksbreak-Anweisungen hinzufügen, es sei denn, es ist erforderlich, den Code unter der nächsten Bezeichnung zu durchlaufen.

Der einzige Block, in dem einbreak nicht erforderlich ist, ist der letzte, aber das Hinzufügen einesbreak zum letzten Block macht den Code weniger fehleranfällig.

Wir können dieses Verhalten auch füromit break when we want the same code executed for several case statements. nutzen. Schreiben wir das Beispiel im vorherigen Abschnitt neu, indem wir die ersten beiden Fälle zusammenfassen:

public String exampleOfSwitch(String animal) {
    String result;
    switch (animal) {
        case "DOG":
        case "CAT":
            result = "domestic animal";
            break;
        case "TIGER":
            result = "wild animal";
            break;
        default:
            result = "unknown animal";
            break;
    }
    return result;
}

4. switch Argument undcase Werte

Lassen Sie uns nun die zulässigen Typen vonswitch Argumenten undcase Werten, die Anforderungen für sie und die Funktionsweise derswitch Anweisung mit Strings diskutieren.

4.1. Datentypen

Wir können nicht alle Arten von Objekten und Grundelementen in der Anweisungswitchvergleichen. A switch works only with four primitives and their wrappers, as well as with the enum type and the String class:

  • byte undByte

  • short undShort

  • int undInteger

  • char undCharacter

  • enum

  • String

Der StypeString ist in der Anweisungswitchab Java 7 verfügbar.

Der Typenumwurde in Java 5 eingeführt und ist seitdem in der Anweisungswitchverfügbar.

Seit Java 5 sind auch Wrapper-Klassen verfügbar.

Natürlich sollten die Argumente vonswitchundcasevom gleichen Typ sein.

4.2. No null Values

We can’t pass the null value as an argument to a switch statement. Wenn wir das tun, wirft das ProgrammNullPointerException, mit unserem erstenswitch example:

@Test(expected=NullPointerException.class)
public void whenSwitchAgumentIsNull_thenNullPointerException() {
    String animal = null;
    Assert.assertEquals("domestic animal", s.exampleOfSwitch(animal));
}

Natürlich können wirnull auch nicht als Wert an die Bezeichnungcaseeinerswitch-Anweisung übergeben. Wenn wir das tun, wird der Code nicht kompiliert.

4.3. Case Werte als Kompilierungszeitkonstanten

Wenn wir versuchen, den Fallwert vonDOGdurch die Variabledog zu ersetzen, wird der Code erst kompiliert, wenn wir die Variabledogalsfinal markieren:

final String dog="DOG";
String cat="CAT";

switch (animal) {
case dog: //compiles
    result = "domestic animal";
case cat: //does not compile
    result = "feline"
}

4.4. String Vergleich

Wenn eineswitch-Anweisung den Gleichheitsoperator zum Vergleichen von Zeichenfolgen verwendet, können wir das mit demnew-Operator erstellteString-Argument nicht korrekt mit demString-Satzwert vergleichen.

Zum Glück sind dieswitch operator uses the equals() method under the hood.

Lassen Sie uns dies demonstrieren:

@Test
public void whenCompareStrings_thenByEqual() {
    String animal = new String("DOG");
    assertEquals("domestic animal", s.exampleOfSwitch(animal));
}

5. Neuerswitch Ausdruck

Java 12 ist verfügbar und damit die Vorschau einer neuen Funktion - ein weniger ausführlicherswitch-Ausdruck.

Um es zu aktivieren, müssen wir–enable-preview an den Compiler übergeben.

Lass uns mal sehen:

var month = JUN;
var value = switch(month) {
  case JAN, JUN, JUL -> 3;
  case FEB, SEP, OCT, NOV, DEC -> 1;
  case MAR, MAY, APR, AUG -> 2;
};

System.out.println(value); // 3

Um die neue Syntax zu nutzen, verwenden wir keinen Doppelpunkt mehr, sondern den aus Lambda Expressions bekannten Operator. Beachten Sie das Fehlen des Schlüsselwortsbreakund dass keine Durchfallfälle auftreten.

Es besteht jedoch weiterhin die Möglichkeit, mithilfe von Codeblöcken eine detaillierte Kontrolle darüber zu erhalten, was auf der rechten Seite des Ausdrucks geschieht. In einem solchen Fall müssen wirbreak manuell daraus ableiten und einen Rückgabewert angeben:

public static void switchLocalVariable() {
    var month = Month.AUG;
    int i = switch (month){
        case JAN,JUN, JUL -> 3;
        case FEB,SEP, OCT, NOV, DEC -> 1;
        case MAR,MAY, APR, AUG -> {
            int j = month.toString().length() * 4;
            break j;
        }
    };
    System.out.println(i); //12
}

6. Fazit

In diesem Tutorial haben wir die Feinheiten der Verwendung der Anweisungswitchin Java kennengelernt. Wir können anhand der Lesbarkeit und der Art der verglichenen Werte entscheiden, obswitch verwendet werden soll.

Die switch-Anweisung ist ein guter Kandidat für Fälle, in denen wir eine begrenzte Anzahl von Optionen in einer vordefinierten Menge haben (z. B. Wochentage). Andernfalls müssen wir den Code jedes Mal ändern, wenn ein neuer Wert hinzugefügt oder entfernt wird, was möglicherweise nicht möglich ist. In diesen Fällen sollten wir andere Ansätze wiepolymorphism oder andere Entwurfsmuster wieCommand berücksichtigen.

Wie immer ist der vollständige Codeover on GitHub verfügbar.