Java enums Wandelbarkeit Use Cases und Möglichkeiten?

8

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.

    
Sebastien Lorber 22.10.2012, 16:40
quelle

6 Antworten

7

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.

    
Paŭlo Ebermann 22.10.2012, 18:50
quelle
6

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.

    
Alex D 22.10.2012 16:50
quelle
3

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.

    
John B 23.10.2012 11:40
quelle
1

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.

    
Yves V. 16.05.2013 16:34
quelle
0

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.

    
Adrian Liu 27.10.2015 07:18
quelle
-3
  

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.

    
Miserable Variable 22.10.2012 16:45
quelle

Tags und Links