ProgrammierungBackend-Entwickler

Was ist der switch-Ausdruck in Java, wie unterscheidet er sich vom klassischen switch und welche Feinheiten gibt es bei seiner Verwendung?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort.

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:

  • Switch ist zu einem Ausdruck geworden: man kann das Ergebnis einer Variablen zuweisen.
  • Die neue Syntax erleichtert das Lesen und verhindert vergessene break.
  • Unterstützung mehrerer Labels (case A, B -> ...).

Trickfragen.

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; };

Typische Fehler und Anti-Patterns

  • Fehlendes default bei der Arbeit mit nicht-nullbaren Typen führt zu einem Kompilierungsfehler.
  • Versuch, null außerhalb von default zu verarbeiten, führt zu NullPointerException.
  • Verwendung von switch mit einer hohen Anzahl von Verschachtelungen anstelle von Polymorphismus.

Beispiel aus dem Leben

Negativer Fall

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:

  • Schnell zu schreiben.

Nachteile:

  • Mängel führen zu kritischen Bugs.
  • Code ist schwer zu lesen und zu warten.

Positiver Fall

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:

  • Umfassende Analyse — weniger Fehler.
  • Code ist kompakt und lesbar.

Nachteile:

  • Erfordert Java 14+ und Kenntnisse der modernen Syntax.