En programmation informatique, les structures conditionnelles sont fondamentales pour implémenter la logique métier dans vos applications. Ces instructions vous permettent d’indiquer des conditions ou des embranchements d’exécution dans vos programmes informatiques. La plus connue d’entre elles est la structure if/else.
Java, en tant que langage orienté objet, dispose de plusieurs structures conditionnelles. Dans cet article, nous allons parler de la principale d’entre elles : l’instruction Switch/Case.
Le problème avec la structure conditionnelle IF/ELSE
Rappelons que dans une instruction conditionnelle, on commence par rédiger une condition (ou un prédicat) dans laquelle on teste la valeur d’une variable contre une autre valeur. Ensuite, on rédige un bloc d’instructions qui sera exécuté si le test est positif, et enfin on rédige un autre bloc d’instructions qui sera exécuté si le test est négatif. Les prédicats peuvent être imbriqués les uns sur les autres dans les différents blocs (comme l’indique la figure précédente). Cela signifie que vous pouvez avoir plusieurs conditions dans les blocs d’instructions.
L’inconvénient majeur de la structure IF/ELSE est que lorsqu’on imbrique plusieurs conditions, le code deviens très difficile à lire et par conséquent très difficile à maintenir. D’ailleurs, il est très difficile d’écrire des blocs conditionnels IF/ELSE avec plus de 2 imbrications. Or, dans le développement applicatif, vous travaillerez beaucoup avec le type ENUM, c’est-à-dire des énumérateurs qui maintiennent une liste d’éléments spécifiques. Par exemple, on peut avoir en ENUM, une liste de code couleur, une liste de code pays (avec le pays les représentant), des codes postaux, etc. Bref, en programmation, on travaille beaucoup avec des énumérations, et la meilleure façon de les utiliser c’est à travers des structures conditionnelles pour indiquer pour chaque valeur, les instructions à exécuter. Par exemple, on peut dire que si le code pays est AU, alors exécuter un bloc de code particulier, lorsque le code est CMR, exécuter un autre bloc, etc.
Si la liste de l’énumérateur est inférieur à 3, la structure conditionnelle IF/ELSE peut parfaitement suffir pour l’implémenter. Mais à partir du moment où on dépasse 3, 4 valeurs, alors le code devient beaucoup trop difficile à lire avec le IF/ELSE et c’est ainsi qu’entre en jeu la structure conditionnelle SWITCH/CASE.
Définition du Switch/Case
Le Switch/Case est une structure conditionnelle en Java qui vous permet de sélectionner un ensemble d’instructions à exécuter en fonction de la valeur d’une variable. Il s’agit en fait d’une instruction très similaire à l’instruction if de Java, à la différence qu’il offre une syntaxe plus comprimée qui permet d’exprimer facilement plusieurs conditions. Dans ce tutoriel sur les switch Java, nous expliquerons à la fois le fonctionnement de cette instruction et les modifications apportées à cette instruction avec la possibilité de « switcher » sur les enums , les chaînes et, enfin, la nouvelle syntaxe des expressions switch qui a été ajoutée dans Java 12 et améliorée dans Java 13.
Exemples d’illustration du Switch/Case Java
Considérons la fonction direBonjour qui affiche « Bonjour » dans une langue donnée par l’utilisateur. Cette fonction peut s’écrire à utilisant des instructions if/else imbriquées :
public void direBonjourAvecIf(int choix){
if(choix == 1){
System.out.println("Bonjour");
}
else if(choix == 2){
System.out.println("Hello");
}
else if(choix == 3){
System.out.println("Buenos dias");
}
else{
System.out.println("Choix incorrect");
}
}
Vous voyez ce que nous disions plus haut par rapport au code précédent lorsqu’on a plus de 2 conditions à exprimer dans une structure IF/ELSE classique ?? Quoi qu’il marche parfaitement, le code ci-dessus est illisible, pas élégant du tout et serait difficile à maintenir. Pour améliorer sa lisibilité, nous pourrions utiliser une instruction switch :
public void direBonjourAvecSwitch(int choix){
switch(choix){
case 1:
System.out.println("Bonjour");
break;
case 2:
System.out.println("Hello");
break;
case 3:
System.out.println("Buenos dias");
break;
default:
System.out.println("Choix incorrect");
break;
}
}
Vous voyez qu’avec le Switch/Case, les conditions sont exprimées de façon plus élégante, et en prime, le code est très lisible.
L’instruction break
En Java, les instructions switch impliquent le plus souvent qu’un seul des blocs Case soit exécuté. Il peut donc être nécessaire d’en sortir grâce à une instruction particulière qui fait partie de l’instruction Switch appelée break. L’instruction break est exécutée après la fin d’un case pour sortir du switch. Si vous oubliez d’écrire une instruction break dans votre Switch/Case, les cases situés en dessous seront également évaluées (et donc exécutées). L’exemple suivant illustre l’utilisation de l’instruction break :
public void direBonjour(int choix){
switch(choix){
case 1:
System.out.println("Bonjour");
case 2:
System.out.println("Hello");
break;
default:
System.out.println("Choix incorrect");
break;
}
}
L’appel de la fonction ci-dessus dans une fonction main de la façon suivante direBonjour(1) affiche à la console
1 Bonjour
2 Hello
Il faut donc donc faire attention et mettre des instructions break à chaque fin de case sauf si vous voulez effectuer un traitement particulier.
Quelques règles importantes à retenir pour les instructions switch java
Voici les règles fondamentales à respecter pour que le Switch/Case vous offre toute sa puissance.
D’abord, vous devez savoir qu’un switch ne fonctionne qu’avec quatre types de données et leurs wrappers, ainsi qu’avec le type enum et la classe String :
- byte et Byte
- short et Short
- int et Integer
- char et Character
- enum
- String
Ensuite, le type String n’est compatible avec l’instruction switch qu’à partir de Java 7. Le type enum a été introduit dans Java 5 et est compatible avec l’instruction switch depuis lors. Bien entendu, les valeurs de l’argument switch et des cases doivent être du même type.
Et enfin, il est indispensable de respecter les points suivants :
- Les valeurs de cases dupliquées ne sont pas autorisées.
- La valeur d’un case doit être du même type de données que la variable dans le switch.
- La valeur d’un case doit être une constante ou un littéral. Les variables ne sont pas autorisées.
- L’instruction break est utilisée à l’intérieur du switch pour mettre fin à une séquence d’instructions.
- L’instruction break est importante. Si elle est omise, l’exécution se poursuit avec le case suivant.
- L’instruction default est facultative et peut apparaître n’importe où dans le bloc switch. Si elle n’est pas à la fin, alors une instruction break doit être mise juste après le default.
Voilà ! Normalement, si vous respectez ces règles, alors vous êtes sûrs de faire marcher le Switch/Case pour vous. Nous allons finir cet article sur une nouveauté importante introduite dans le switch/case à partir du JDK 12.
Les Switch expressions
Une nouvelle fonctionnalité importante a été introduite en Java depuis le JDK 12 et a été améliorée dans la version 13 : Le switch expression. Voyons comment fonctionne ce nouveau switch sur les mois :
var result = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
default -> throw new IllegalStateException("Invalid day: " + day);
}
Pour une valeur de Day égale à DAY.SATURDAY result aura comme valeur 8. Remarquez que la nouvelle syntaxe utilise l’opérateur -> au lieu des deux points auxquels nous sommes habitués avec les instructions switch. De plus, il n’y a pas de mot-clé break. Un autre ajout est le fait que nous pouvons maintenant avoir des différentes valeurs de cases séparées par des virgules.
Voilà ! Ceci conclut cet article sur l’utilisation du Switch/Case. Si vous voulez aller loin sur Java, vous pouvez vous rendre sur le site officiel de Java. Si vous souhaitez aller loin en programmation informatique, nous vous offrons cette formation vidéo de 60 min pour apprendre à programmer en Scala par la pratique. Cliquez sur le bouton suivant et rentrez votre mail pour le télécharger.