Sind Java Enum Variablen statisch? [Duplikat]

7
%Vor%

Im obigen Code ändert sich der Wert der Operation für beide Operationen. Wie kann ich zwei Instanzen von Operations.SINGLE mit unterschiedlichen Operationstypen haben?

    
Optional 18.06.2013, 10:32
quelle

6 Antworten

13

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.

    
Eric Jablow 18.06.2013, 10:40
quelle
11
  

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.

    
dasblinkenlight 18.06.2013 10:38
quelle
10

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.

    
Bohemian 18.06.2013 10:37
quelle
2

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.

    
Vlasec 02.02.2015 10:31
quelle
0

Ja, alle Elemente von enum sind static final constant . Wie in einer anderen Antwort von darijan erwähnt, gibt es jedoch einen logischen Fehler in Ihrem Programm.

    
Mubin 18.06.2013 10:35
quelle
0

Es gibt einen Fehler in der vierten Zeile von main method

%Vor%

sollte

sein %Vor%     
darijan 18.06.2013 10:35
quelle

Tags und Links