Ich weiß nicht, ob ich das als einziger weiß, aber die Werte eines Enums sind nicht implizit endgültig und können modifiziert werden.
%Vor% Diese Werte werden oft bei der Instanzerstellung initialisiert ( TOTO("TOTO 1")
), aber außer mir habe ich noch nie jemanden gesehen, der das final-Schlüsselwort für Enum-Variablen verwendet hat, die unveränderlich sein sollten. Das ist nicht der Punkt der Frage, nur zu fragen, ob ich der einzige bin, der sich dessen bewusst ist.
Was würde ich gerne wissen, wenn es einen Anwendungsfall gäbe, um veränderbare enums zu erstellen?
Und ich würde auch gerne die Grenzen dessen kennen, was wir mit enums machen können (gute Praxis oder nicht). Ich habe es nicht getestet, aber vielleicht kann ein Enum mit Spring Beans injiziert werden? Zumindest scheint es, dass wir jede Instanz mit Annotationen versehen können (@Deprecated funktioniert zum Beispiel gut) und auch die Methoden.
Ein möglicher Usecase wäre eine träge Initialisierung (einige Feldwerte werden berechnet, wenn sie zum ersten Mal verwendet werden, wenn sie oft überhaupt nicht verwendet werden) oder ein "normales" veränderbares Singleton-Objekt (wie eine Registrierung oder Ähnliches).
In den meisten Fällen sollten Enumerationsobjekte jedoch unveränderlich sein und ihre Felder sind endgültig.
Während Sie hier auf eine interessante Tatsache hinweisen, gibt es, soweit es mich betrifft, keinen Anwendungsfall für veränderbare enum-Felder. Es gibt viele Gründe, warum die Verwendung dieser Sprache "Feature" ("Bug"?) Eine schlechte Idee wäre, nicht zuletzt die Möglichkeit, andere Entwickler zu verwirren.
Als Reaktion auf Alex Ds Antwort und Kommentar nehme ich seinen Vorschlag, einen möglichen Anwendungsfall zu veröffentlichen, an. Nehmen wir das alte Standard-Enum-Beispiel von Planeten, aus denen die Gravitation usw. berechnet werden kann. Stellen Sie sich vor, Sie wollten die Anzahl menschlicher Kolonien auf jedem Planeten erhalten. Ja, Sie könnten eine EnumMap verwenden, aber ich könnte einen Fall sehen, wo mehr und mehr veränderbare Felder benötigt werden könnten und entweder eine separate Map für jeden Wert oder eine separate Klasse für die veränderlichen Werte, die mit einer Enumeration verbunden sind, wäre nicht intuitiv.
Wie ich in meinen Kommentaren ausgeführt habe, glaube ich, dass Enums normalerweise unveränderlich sind und bleiben sollten, aber ich halte es für zu stark, wenn ich feststelle, dass es keine Anwendungsfälle gibt.
Ich sehe keinen Grund, die Verwendung von veränderbaren Feldern in enum
s zu verbieten. Man verwendet enum
, um anzugeben, dass der Wert des Typs zu einem endlichen (und bekannten) Satz von Möglichkeiten gehört. Es bedeutet nicht, dass diese Werte keine Eigenschaften haben können, die sich im Laufe der Zeit entwickeln.
Einige haben nach Anwendungsfällen für ein solches Szenario gefragt. Ein Beispiel wäre die Verwendung eines Typs enum
wie ErrorCategory
, der einen Fehler in eine beliebige Anzahl vordefinierter Kategorien einteilen würde (zB: DocumentationError
, SemanticError
, LayoutError
...).
Angenommen, diese ErrorCategories
haben Eigenschaften wie requiresInstantIntervention
oder shouldFailBuild
. Ich kann mir vorstellen, dass sich der Wert dieser Eigenschaften im Laufe der Zeit ändern kann oder dass sie vom Benutzer konfigurierbar sein können.
Ich weiß, dass es (viele) andere Möglichkeiten gibt, dies zu implementieren (wie zum Beispiel EnumMaps
oben) und man kann immer über Stil streiten, aber für mich ist eine solche Verwendung von enum
s nicht falsch selbst. Da enum
s Referenztypen in Java sind, bleibt das Verhalten von ==
gleich, als gäbe es an erster Stelle keine änderbaren Eigenschaften.
Eine enum-Instanz ist ein öffentliches statisches Endfeld der enum-Klasse. Wenn es veränderbar ist, können Sie seinen Status in einem anderen Thread ändern. Dies ist möglicherweise nicht das, was Sie wollen und kann Probleme verursachen, wenn Sie dies nicht erkennen.
Was würde ich gerne wissen, wenn es einen Anwendungsfall gäbe, um veränderbare enums zu erstellen?
Die Enum-Konstanten sind nicht selbst veränderbar, ihre Felder sind veränderbar.