1. Introduction
En programmation, on travaille souvent avec des listes d’options limitées et connues à l’avance. Par exemple : les jours de la semaine, les couleurs du feu tricolore, les niveaux de difficulté d’un jeu, les statuts d’une commande. Chacune de ces options est généralement représentée par une valeur fixe. C’est là que nous nous rapprochons de notre sujet du jour — les énumérations (enum).
Une énumération est un type de données spécial qui permet de déclarer un ensemble de constantes nommées.
enum, c’est comme une boîte avec des étiquettes rangées par cases, où chaque étiquette est un nom unique associé à un nombre.
Atouts principaux d’un enum :
- Votre code devient plus lisible et auto-documenté ;
- Au lieu de mystérieux « nombres magiques » tels que 0, 1, 2, vous avez des noms expressifs : DayOfWeek.MONDAY ou TrafficLight.RED ;
- Le compilateur se plaindra si vous essayez d’assigner une valeur incorrecte ;
- Derrière chaque élément se cache… un entier tout simple ! (Mais nous y reviendrons.)
Syntaxe de déclaration d’un enum
// Modèle générique de déclaration d’une énumération
public enum Name
{
CONSTANT1 ,
CONSTANT2 ,
CONSTANT3
}
Déclarer une énumération en Java est très simple. Voici un exemple de base :
// Fichier DayOfWeek.java
public enum DayOfWeek {
MONDAY, // 0
TUESDAY, // 1
WEDNESDAY, // 2
THURSDAY, // 3
FRIDAY, // 4
SATURDAY, // 5
SUNDAY // 6
}
Explication :
- Le mot-clé enum indique au compilateur : « C’est une énumération ! »
- Entre accolades, les noms des variantes (constantes) sont séparés par des virgules.
- D’ordinaire, on écrit les noms en UPPER_SNAKE_CASE (toutes les lettres en majuscules, mots séparés par un underscore).
Où peut-on déclarer un enum ?
- Dans un fichier séparé (DayOfWeek.java).
- À l’intérieur d’une classe (si vous avez besoin d’une énumération privée uniquement pour cette classe).
- Même à l’intérieur d’une méthode (mais c’est rare).
2. Utilisation des enum dans le code
Déclaration d’une variable enum :
DayOfWeek today = DayOfWeek.MONDAY;
Désormais, today ne peut prendre que l’une des valeurs déclarées dans DayOfWeek.
Exemple d’utilisation avec switch
switch (today)
{
case MONDAY:
System.out.println("Ouh, lundi...");
break;
case FRIDAY:
System.out.println("Youpi, vendredi !");
break;
default:
System.out.println("Un jour ordinaire.");
}
Différence importante : dans case, on écrit simplement le nom de la constante (sans préfixe) si le type de la variable est déjà connu du compilateur.
Itération sur toutes les valeurs d’un enum
Chaque enum possède une méthode statique values(), qui renvoie un tableau de toutes ses valeurs :
for (DayOfWeek day : DayOfWeek.values())
{
System.out.println(day);
}
C’est très pratique pour afficher un menu, valider, générer des options, etc.
3. Méthodes des enum : name(), ordinal(), valueOf()
Les énumérations en Java ne sont pas de simples listes de constantes, mais de véritables classes avec des méthodes !
Méthode name()
Renvoie le nom de la constante sous forme de chaîne (tel qu’il est écrit dans le code) :
DayOfWeek day = DayOfWeek.FRIDAY;
System.out.println(day.name()); // "FRIDAY"
Méthode ordinal()
Renvoie l’indice ordinal de la constante (à partir de zéro) :
System.out.println(DayOfWeek.MONDAY.ordinal()); // 0
System.out.println(DayOfWeek.FRIDAY.ordinal()); // 4
Attention : il ne faut pas stocker ni comparer des enum via ordinal() si l’ordre peut changer à l’avenir ! Préférez les noms.
Méthode valueOf(String name)
Convertit une chaîne en valeur d’énumération si une telle constante existe :
DayOfWeek day = DayOfWeek.valueOf("MONDAY");
System.out.println(day); // MONDAY
Si la chaîne ne correspond pas, une exception IllegalArgumentException sera levée.
Méthode values()
Renvoie le tableau de toutes les valeurs de l’énumération (exemple déjà vu ci-dessus) :
DayOfWeek[] days = DayOfWeek.values();
4. Enum avec champs, constructeur et méthodes
On peut enrichir les énumérations en Java : ajouter des champs, des constructeurs, des méthodes ! Oui, ce n’est pas juste une liste de noms, mais une mini-classe.
Exemple : jours de la semaine avec nom localisé
public enum DayOfWeek
{
MONDAY("Lundi"),
TUESDAY("Mardi"),
WEDNESDAY("Mercredi"),
THURSDAY("Jeudi"),
FRIDAY("Vendredi"),
SATURDAY("Samedi"),
SUNDAY("Dimanche");
private final String russianName;
// Constructeur (private par défaut)
DayOfWeek(String russianName)
{
this.russianName = russianName;
}
public String getRussianName()
{
return russianName;
}
}
Vous en apprendrez davantage sur le fonctionnement lorsque nous commencerons à étudier la POO aux niveaux 27+ :P
On peut maintenant faire ceci :
DayOfWeek day = DayOfWeek.WEDNESDAY;
System.out.println(day.getRussianName()); // "Mercredi"
Astuce : chaque valeur d’un enum peut porter ses propres données (dans ce cas — un nom localisé).
Avantages d’utiliser des enum
- Sécurité de type : on ne peut pas attribuer accidentellement à une variable enum une valeur qui n’est pas dans la liste.
- Lisibilité : le code s’auto-documente (TrafficLight.RED au lieu de 1 ou "red").
- Facilité de maintenance : pour ajouter ou supprimer une option, tout se fait à un seul endroit.
- Fonctionne avec switch : enum est idéal pour des branches selon la valeur.
- Extensible : vous pouvez ajouter des champs, des méthodes, implémenter des interfaces.
- Moins d’erreurs : le compilateur aide à ne pas oublier de traiter les cas (surtout dans les constructions switch).
6. Pratique : utilisons un enum dans notre application
Ajoutons dans notre mini-application la prise en charge des jours de la semaine via un enum.
Étape 1. Déclarons un enum
public enum DayOfWeek
{
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
Étape 2. Utilisons-le dans le code
System.out.println("Saisissez le jour de la semaine (par exemple, MONDAY) :");
Scanner console = new Scanner(System.in);
String input = console.nextLine().toUpperCase();
DayOfWeek day = DayOfWeek.valueOf(input);
switch (day)
{
case MONDAY:
System.out.println("Début de la semaine de travail !");
break;
case FRIDAY:
System.out.println("Bientôt le week-end !");
break;
case SATURDAY:
case SUNDAY:
System.out.println("Youpi, c’est le week-end !");
break;
default:
System.out.println("Journée de travail ordinaire.");
}
Ce qui se passe :
- L’utilisateur saisit un jour de la semaine (par exemple, "monday" ou "MONDAY").
- On convertit la chaîne en majuscules (toUpperCase()) pour ne pas dépendre de la casse.
- On convertit la chaîne en valeur d’énumération via valueOf.
- On utilise switch pour afficher un message différent.
- Si l’entrée est invalide — on intercepte l’erreur et on affiche un avertissement.
7. Erreurs typiques avec les enum
Erreur n°1 : utiliser des chaînes ou des nombres au lieu d’un enum. Très souvent, les débutants continuent d’écrire ainsi :
int day = 1; // 1 — c’est lundi ?
ou
String status = "DELIVERED";
Ce n’est pas idéal : on peut se tromper dans l’orthographe, et le code est difficile à maintenir. Utilisez un enum !
Erreur n°2 : comparer des enum avec == et .equals(). En Java, on peut comparer les valeurs d’un enum avec == — c’est sûr, car toutes les valeurs sont uniques dans la classe enum :
if (day == DayOfWeek.MONDAY) { ... } // OK !
Bien que .equals() fonctionne aussi, on utilise plus souvent ==.
Erreur n°3 : mauvais noms d’éléments d’un enum. N’appelez pas les éléments VALUE1, VALUE2, VALUE3 — dans un mois, personne ne saura ce que cela signifie ! Utilisez des noms explicites.
Erreur n°4 : utiliser ordinal() pour la logique. N’écrivez pas ceci :
if (day.ordinal() == 0) { ... } // À ne pas faire !
L’ordre des éléments peut changer, et tout se cassera. Utilisez les noms !
GO TO FULL VERSION