Ja, Instanzen sind implizit static
und final
. Dies bedeutet, dass der Code unklug ist. Stellen Sie sich zwei Threads vor, die beide SINGLE.setOperation(Type)
; Sie werden kein Vertrauen in das haben, was Sie anrufen.
Aus der Java-Sprachspezifikation, Abschnitt 8.9 :
Aufzählungstypen (§8.9) dürfen nicht abstrakt sein; Dies führt zu einem Fehler bei der Kompilierung.
Ein Aufzählungstyp ist implizit endgültig, es sei denn, er enthält mindestens eine Aufzählungskonstante, die einen Klassenkörper hat.
Es ist ein Fehler bei der Kompilierung, einen Enum-Typ explizit als endgültig zu deklarieren.
Verschachtelte Aufzählungstypen sind implizit statisch. Es ist zulässig, einen verschachtelten Enum-Typ explizit als statisch zu deklarieren.
Und im nächsten Abschnitt:
Der Body eines Enum-Typs kann Enum-Konstanten enthalten. Eine Aufzählungskonstante definiert eine Instanz des Aufzählungstyps.
Da es nur eine Instanz jeder Enum-Konstante gibt, ist es zulässig, den Operator == anstelle der equals-Methode zu verwenden, wenn zwei Objektreferenzen verglichen werden, wenn bekannt ist, dass mindestens einer von ihnen auf eine Enum-Konstante verweist.
Wie kann ich zwei Instanzen von Operations.SINGLE mit unterschiedlichen Operationstypen haben?
Die grundlegende Idee hinter enum
ist, dass es nur eine Instanz von jedem seiner Mitglieder gibt. So können Sie sie sicher auf Gleichheit hin vergleichen, ohne befürchten zu müssen, dass an einem anderen Ort ein weiteres SINGLE
oder MULTIPLE
erstellt wurde.
Wenn Sie mehrere Instanzen von SINGLE
möchten, stellen Sie eine class
und keine enum
. Die Tatsache, dass du deinen enum
mutable indirekt in die gleiche Richtung gesetzt hast: die Verwendung von enum
ist in deiner Situation eine falsche Wahl.
Enum-Instanzen sind "statisch" (dh sie verhalten sich wie statische Variablen), sind aber nicht unveränderlich .
Alle Threads sehen dasselbe Objekt, auf das sich der Name enum bezieht - sie sind wie Singletons, mit einer eisernen Garantie der JVM, dass es immer nur eine Instanz eines Enums gibt. Wenn Sie ein Feld einer Enumeration ändern, ändert sich dies für alle.
Es empfiehlt sich, die Felder final
in einer Enumeration zu erstellen und sie unveränderlich zu machen.
Ich bin eineinhalb Jahre zu spät. Aber ich sehe, dass die Frage nicht wirklich beantwortet wurde.
Die Lösung würde eine Klasse anstelle von enum verwenden, die diese beiden enums als Felder hat:
%Vor%Sie können natürlich enum statt class verwenden. Dann müssen Sie alle Kombinationen aufzählen:
%Vor% Beide Ansätze sind gültig, manchmal möchten Sie wirklich alle Kombinationen aufzählen, die meiste Zeit sollten Sie jedoch bei der class
Vorgehensweise bleiben.
Der Kürze halber habe ich die enums Quantity
und Type
nicht definiert, es sind nur einfache enums.