ProgrammationDéveloppeur Java Senior

Comment fonctionnent les enum en Java, quelles subtilités sont liées à leur utilisation, et pourquoi un enum n'est-il pas seulement un simple ensemble de constantes ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

En Java, enum est un type de classe, hérité de java.lang.Enum, qui représente un ensemble d'objets constants limités, mais ne se limite pas seulement à un ensemble de noms : un enum peut être étendu avec des méthodes, des champs, un constructeur, implémenter des interfaces et ajouter du comportement.

Exemple :

enum Day { MONDAY("Jour de semaine"), SATURDAY("Jour de repos"); private String description; Day(String description) { this.description = description; } public String getDescription() { return description; } } Day d = Day.SATURDAY; System.out.println(d.getDescription()); // "Jour de repos"

Subtilités :

  • Enum garantit l'unicité des constantes : des instances singleton.
  • Peut implémenter des interfaces.
  • Chaque valeur a sa propre classe (peut redéfinir des méthodes par valeur).
  • Enum est protégé contre le clonage et la création de nouvelles instances via reflection.

Question piège

Question : "Peut-on redéfinir des méthodes pour certaines valeurs d'un enum ? Si oui, comment ?"

Erreur fréquente : on suppose à tort que tous les comportements des valeurs sont toujours identiques.

Réponse correcte : Oui, des implémentations spécifiques pour certaines constantes sont possibles.

Exemple :

enum Operation { PLUS { double apply(double x, double y) { return x + y; } }, MINUS { double apply(double x, double y) { return x - y; } }; abstract double apply(double x, double y); }

Exemples d'erreurs réelles dues à l'ignorance des subtilités du sujet


Histoire

Dans un système de comptabilité des automobilistes, les statuts étaient stockés avec des enums, sans mettre en œuvre un champ supplémentaire pour le code API — les développeurs ont essayé d'étendre l'enum par héritage, ce qui est interdit. Au final, il a fallu retravailler le modèle de stockage des statuts.


Histoire

Dans un site de commerce électronique, des programmeurs ont "décompressé" l'enum avec un constructeur privé à l'aide d'un utilitaire de reflection pour créer une instance factice pour les tests, mais ont reçu une Exception : l'enum est protégé contre la création de nouvelles instances. CI a échoué, les tests ont échoué.


Histoire

Sur un ancien projet, les valeurs de l'enum étaient comparées par equals(), et non par ==. De manière inattendue, des problèmes sont survenus lors de la désérialisation : les valeurs d'enum sont toujours comparées par ==, car ce sont des singletons.