ProgrammazioneSviluppatore Backend

Cos'è un'espressione switch in Java, come si differenzia dallo switch classico e quali sono le sottigliezze da considerare nel suo utilizzo?

Supera i colloqui con l'assistente IA Hintsage

Risposta.

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 è diventato un'espressione: è possibile assegnare il suo risultato a una variabile.
  • La nuova sintassi facilita la lettura e previene i break dimenticati.
  • Supporto per etichette multiple (case A, B -> ...).

Domande trabocchetto.

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

Errori tipici e anti-pattern

  • L'assenza di default quando si lavora con tipi non nullabili porterà a un errore di compilazione.
  • Tentare di gestire null al di fuori di default causerà NullPointerException.
  • Uso di switch con molteplici annidamenti, invece di polimorfismo.

Esempio dalla vita reale

Caso negativo

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:

  • Facile e veloce da scrivere.

Svantaggi:

  • Imprecisioni portano a bug critici.
  • Il codice è difficile da leggere e mantenere.

Caso positivo

Utilizzo della nuova espressione switch per abbinare enum al risultato:

String status = switch(orderStatus) { case PAID -> "Pagato"; case CANCELED -> "Annullato"; default -> "In elaborazione"; };

Vantaggi:

  • Analisi esaustiva — meno errori.
  • Codice compatto e leggibile.

Svantaggi:

  • Richiede Java 14+ e conoscenze della sintassi moderna.