In Java ist ein Enum ein Klassen-Typ, der von java.lang.Enum erbt und eine Sammlung begrenzter Konstante-Objekte darstellt, sich jedoch nicht nur auf eine Namenssammlung beschränkt: Ein Enum kann mit Methoden, Feldern, Konstruktoren erweitert werden, Schnittstellen implementieren und Verhalten hinzufügen.
Beispiel:
enum Day { MONDAY("Werktag"), SATURDAY("Wochenende"); private String description; Day(String description) { this.description = description; } public String getDescription() { return description; } } Day d = Day.SATURDAY; System.out.println(d.getDescription()); // "Wochenende"
Feinheiten:
Frage: "Kann man in einem Enum Methoden für bestimmte Enum-Werte überschreiben? Wenn ja, wie?"
Häufige Fehler: Man geht fälschlicherweise davon aus, dass das Verhalten aller Werte immer gleich ist.
Richtige Antwort: Ja, spezifische Implementierungen sind für einzelne Konstanten möglich.
Beispiel:
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); }
Geschichte
Im System zur Erfassung von Autofahrern wurden Status mit Enums gespeichert, es wurde kein zusätzliches Feld für den API-Code implementiert — die Entwickler versuchten, das Enum durch Vererbung zu erweitern, was jedoch verboten ist. Am Ende musste das Speichermodell der Status überarbeitet werden.
Geschichte
In einem Online-Shop haben Programmierer das Enum mit einem privaten Konstruktor durch ein Reflection-Tool "entpackt", um eine gefälschte Instanz für Tests zu erstellen, erhielten jedoch eine Ausnahme: Enum ist vor der Erstellung neuer Instanzen geschützt. CI hat nicht bestanden, die Tests sind fehlgeschlagen.
Geschichte
In einem alten Projekt wurden Enum-Werte mit equals() verglichen, anstatt mit ==. Unerwartet traten beim Deserialisieren Probleme auf: Enum-Werte werden immer mit == verglichen, da es sich um Singletons handelt.