Historique de la question :
Avant Java 12, l'instruction switch était utilisée uniquement comme une instruction. Avec la sortie de Java 12/14, des expressions switch (switch expression) sont apparues, élargissant la syntaxe et les possibilités de l'instruction. Les expressions switch sont conçues pour un code plus concis et expressif.
Problème :
Le switch classique pose souvent des erreurs : un break oublié entraîne un fall-through, la lisibilité est compromise avec de nombreux cas, il est impossible de renvoyer un résultat directement dans une expression, et il manque une vérification exhaustive des valeurs.
Solution :
L'expression switch peut renvoyer une valeur, utiliser une syntaxe fléchée, supporter une analyse exhaustive à la compilation et gérer les null grâce à default. Elle a la syntaxe suivante :
String result = switch(day) { case MONDAY, FRIDAY -> "Jour de travail"; case SATURDAY, SUNDAY -> "Week-end"; default -> throw new IllegalArgumentException(); };
Caractéristiques clés :
Le switch peut-il fonctionner avec des enum, des chaînes et des null ?
Fonctionne avec les enum depuis Java 5. Avec les chaînes depuis Java 7. Les null ne sont gérés que via default, sinon il y aura une NPE.
switch(day) { // day == null default: System.out.println("null"); } // fonctionne
Que se passe-t-il si toutes les options de l'enum ne sont pas implémentées dans l'expression switch ?
Le compilateur exigera un default ou une implémentation pour toutes les valeurs. En l'absence de cela, une erreur de compilation se produira.
Peut-on utiliser break dans l'expression switch de nouveau type ?
Dans la version fléchée, break n'est pas nécessaire. Si un bloc est utilisé (case X -> { ... }), yield peut être utilisé pour renvoyer une valeur :
int num = switch(x) { case 1 -> 10; case 2 -> { yield 20; } default -> 0; };
Switch classique avec int sans break :
switch(type) { case 1: actionA(); case 2: actionB(); // est appelé à la fois pour type==1 et type==2 }
Avantages :
Inconvénients :
Utilisation de la nouvelle expression switch pour matcher un enum avec un résultat :
String status = switch(orderStatus) { case PAID -> "Payé"; case CANCELED -> "Annulé"; default -> "En attente"; };
Avantages :
Inconvénients :