Storia della domanda:
Fino a Java 12, l'operatore switch veniva utilizzato esclusivamente come statement. Con l'uscita di Java 12/14 sono apparse le espressioni switch (switch expression), che hanno ampliato la sintassi e le possibilità dell'operatore. Le espressioni switch sono destinate a un codice più conciso ed espressivo.
Problema:
Lo switch classico provoca spesso errori: un break dimenticato porta a fall-through, e la leggibilità è compromessa con molti casi, impossibilità di restituire direttamente un risultato nell'espressione, assenza di una verifica esaustiva dei valori.
Soluzione:
Le espressioni switch possono restituire un valore, utilizzare la sintassi a freccia, supportare un'analisi esaustiva in fase di compilazione e gestire null tramite default. Ha la seguente sintassi:
String result = switch(day) { case MONDAY, FRIDAY -> "Lavorativo"; case SATURDAY, SUNDAY -> "Weekend"; default -> throw new IllegalArgumentException(); };
Caratteristiche chiave:
Lo switch può lavorare con enum, stringhe e null?
Con enum funge da Java 5. Con le stringhe da Java 7. Null è gestito solo tramite default, altrimenti si verifica NPE.
switch(day) { // day == null default: System.out.println("null"); } // funziona
Cosa succede se non vengono implementate tutte le varianti enum nell'espressione switch?
Il compilatore richiederà default o implementazione per tutti i valori. In assenza di ciò, si verificherà un errore di compilazione.
È possibile utilizzare break nell'espressione switch del nuovo tipo?
Nella variante a freccia, il break non è necessario. Se si utilizza un blocco (case X -> { ... }), è possibile utilizzare yield per restituire un valore:
int num = switch(x) { case 1 -> 10; case 2 -> { yield 20; } default -> 0; };
Switch classico con int senza break:
switch(type) { case 1: actionA(); case 2: actionB(); // viene chiamato sia per type==1 che per type==2 }
Vantaggi:
Svantaggi:
Utilizzo della nuova espressione switch per abbinare enum al risultato:
String status = switch(orderStatus) { case PAID -> "Pagato"; case CANCELED -> "Annullato"; default -> "In elaborazione"; };
Vantaggi:
Svantaggi: