2010-07-12 8 views
45

Wenn ich ein enum-Objekt habe, wird es als primitiv oder als Referenz betrachtet?Werden Java-Enums als primitive oder Referenztypen betrachtet?

+0

Aufzählungen sind absolut normal Klassen w/einige Optimierungen (für die Serialisierung) + c-tor-Check für Vererbungsstufe + extra gemeinsamen Array (nicht geklonte()) der deklarierten enums. Die public method values ​​() gibt immer eine neue Kopie zurück. Sie können Schnittstellen implementieren und was nicht :) – bestsss

Antwort

50

Es ist ein Referenztyp.

Im Gegensatz zu vielen Sprachen, in denen enum eine Reihe von Integralkonstanten ist, sind Java-Enums unveränderliche Objektinstanzen. Sie können den numerischen Wert einer enum-Instanz abrufen, indem Sie ordinal() aufrufen.

Sie können sogar Ihre eigenen Mitglieder in die Enum-Klasse, wie folgt hinzufügen:

public enum Operation { 
    PLUS { double eval(double x, double y) { return x + y; } }, 
    MINUS { double eval(double x, double y) { return x - y; } }, 
    TIMES { double eval(double x, double y) { return x * y; } }, 
    DIVIDE { double eval(double x, double y) { return x/y; } }; 

    // Do arithmetic op represented by this constant 
    abstract double eval(double x, double y); 
} 
//Elsewhere: 
Operation op = Operation.PLUS; 
double two = op.eval(1, 1); 
+0

+1 Ich war mir dieser Funktionalität nicht bewusst. Können Sie ein Beispiel für die Verwendung dieser Operation in Aktion geben? – corsiKa

+10

'Enum'-Instanzen müssen eigentlich nicht unveränderlich sein. Ein Enum kann veränderbare Variablen haben. – sepp2k

+0

@glowcoder: 'Operation.PLUS.eval (1, 1)' – SLaks

0

This article im Wesentlichen zeigt Ihnen, wie Aufzählungen umgesetzt werden, und wie SLaks sagt, sie sind Referenzen.

10

Die Art und Weise Aufzählungen Arbeit ist eigentlich nicht viel anders aus, wie sie vor ihrer Einführung wurden verwendet, um mit Java 5:

public final class Suit { 

public static final Suit CLUBS = new Suit(); 
public static final Suit DIAMONDS = new Suit(); 
public static final Suit HEARTS = new Suit(); 
public static final Suit SPADES = new Suit(); 

/** 
* Prevent external instantiation. 
*/ 
private Suit() { 
    // No implementation 
}} 

Durch die unterschiedlichen Farben auf das Laden von Klassen instanziieren sichergestellt ist, dass diese sich gegenseitig ausschließen wird und Der private Konstruktor stellt sicher, dass keine weiteren Instanzen erstellt werden.

Diese wären entweder durch == oder gleichwertig vergleichbar.

ENUM Java 5 funktioniert so ziemlich die gleiche Art und Weise, aber mit einigen notwendigen Funktionen Serialisierung usw.

Ich hoffe, dieser Hintergrund wirft ein weiteres Licht zu unterstützen.

Verwandte Themen