ProgrammationDéveloppeur Backend

Qu'est-ce qu'une expression switch en Java, comment diffère-t-elle du switch classique et quelles subtilités existe-t-il dans son utilisation ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

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 est devenu une expression : il est possible d'assigner son résultat à une variable.
  • La nouvelle syntaxe facilite la lecture et prévient les oublis de break.
  • Support des étiquettes multiples (case A, B -> ...).

Questions pièges.

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

Erreurs typiques et anti-patterns

  • L'absence de default lors de l'utilisation de types non-nulls entraînera une erreur de compilation.
  • Tenter de gérer les null en dehors de default déclenchera une NullPointerException.
  • Utilisation du switch avec une grande profondeur d'imbrication, au lieu du polymorphisme.

Exemple de la vie réelle

Cas négatif

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 :

  • Rapide à écrire.

Inconvénients :

  • Les lacunes entraînent des bugs critiques.
  • Le code est difficile à lire et à maintenir.

Cas positif

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 :

  • Analyse exhaustive — moins d'erreurs.
  • Le code est compact et lisible.

Inconvénients :

  • Nécessite Java 14+ et des connaissances en syntaxe moderne.