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 :
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); }
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.