ProgrammierungJava Senior Developer

Wie funktionieren Enums in Java, welche Feinheiten sind mit ihrer Verwendung verbunden, und warum ist ein Enum nicht nur eine einfache Ansammlung von Konstanten?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort

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:

  • Enum garantiert die Einzigartigkeit von Konstanten: Instanzen sind Singletons.
  • Schnittstellen können implementiert werden.
  • Jedes Wert hat seine eigene Klasse (Methoden können pro Wert überschrieben werden).
  • Enum ist vor Klonen und der Erstellung neuer Instanzen durch Reflection geschützt.

Fangfrage

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

Beispiele für reale Fehler aufgrund mangelnden Wissens über die Feinheiten des Themas


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.