2010-01-16 14 views
19

Welche Vorteile bietet es, Enum in Java ähnlich wie eine Klasse zu machen, anstatt nur eine Sammlung von Konstanten wie in C/C++?Enum in Java. Vorteile?

+0

prüfen http://stackoverflow.com/questions/1419835/understanding-enums-in-java/1419849#1419849 – Narayan

Antwort

24

Sie erhalten kostenlose Kompilierzeitprüfung der gültigen Werte. Mit

public static int OPTION_ONE = 0; 
public static int OPTION_TWO = 1; 

nicht

void selectOption(int option) { 
... 
} 

nur 0 oder 1 annehmen wird als Parameterwert nicht gewährleistet. Mit einer Enum, das ist garantiert. Darüber hinaus führt dies zu mehr selbst dokumentierendem Code, da Sie die Codevervollständigung verwenden können, um alle Enum-Werte anzuzeigen.

+0

Diese Antwort trifft den Hauptvorteil , aber es ignoriert einige andere Vorteile, die in anderen Antworten detailliert sind. – DJClayworth

4

Enums sind bereits ein class in Java.

Wenn Sie fragen, warum das besser ist, würde ich sagen, dass bessere Typsicherheit und die Fähigkeit, andere Attribute außer einem einfachen Ordinalwert hinzuzufügen, in den Sinn kommen würden.

0

Enums sind ein Typ für sich - Sie können keine Enum verwenden, die nicht existiert, oder eine andere ähnliche Konstante einfügen. Außerdem können Sie sie aufzählen, sodass der Code präziser sein kann.

mit statischen Konstanten könnte möglicherweise Pflege Alpträume verursachen - vor allem, wenn sie sich ausbreiten.

11

Typ Sicherheit ist ein Grund.

Ein anderer, that I find more important, ist, dass Sie Metadaten an enum-Werte in Java anhängen können. Zum Beispiel könnten Sie eine ENUM verwenden, um die Menge von Rechts Operationen für einen Webservice zu definieren und dann Metadaten für die Art der Anfrage und Datenklasse anhängen:

AddItem(HttpMethod.POST, ProductEntry.class), 
+2

Sei vorsichtig damit. Ich habe oft Leute gesehen, die Enums mit Attributen anstelle von Klassen verwenden.Dies kann zu umgebendem Code führen, der das Enum sehr seltsam und statisch verwendet (effektiv versucht, Objekte in die Enums zu injizieren), da sie unglaublich daran interessiert sind, das Enum zu behalten, anstatt das Enum in eine richtige Klasse umzuwandeln und den Refactor-Hit zu nehmen. – DaveC

+1

Das scheint ziemlich pathologisch zu sein; möchte ein Beispiel sehen. Also sind vielleicht einige Regeln in Ordnung: kein veränderlicher Zustand und kein Verhalten. – kdgregory

3

Neben der besseren Art Sicherheit können Sie auch festlegen, benutzerdefiniertes Verhalten in Ihren enums (siehe Effective Java für einige gute Beispiele).

1

Enum Herstellung einer Referenz-Typ, die festen Satz von Konstanten enthalten hat dazu geführt, um eine effiziente Map Implementierung wie EnumMap und Set Implementierung wie EnumSet (JDK-Klassen).

Von javadoc von EnumMap:
eine spezialisierten Map-Implementierung für die Verwendung mit Aufzählungstyp Tasten. Alle Schlüssel in einer Enum-Map müssen aus einem einzelnen Enum-Typ stammen, der explizit oder implizit beim Erstellen der Map angegeben wird. Enum-Maps werden intern als Arrays dargestellt. Diese Darstellung ist äußerst kompakt und effizient.

EnumMap kombiniert die Reichhaltigkeit und Typensicherheit von Map mit der Geschwindigkeit eines Arrays (Effective Java).

0

Der einzige echte Vorteil ist, dass es in einer switch Anweisung verwendet werden kann. Alle anderen Sachen, zu denen ein enum fähig ist, können einfach mit der Klasse plain vanilla mit einem private Konstruktor gemacht werden, dessen Instanzen wiederum als public static final Felder der betreffenden Klasse deklariert sind (das typsichere Muster). Der andere Vorteil von enum ist offensichtlich, dass es den Code weniger ausführlich macht, als Sie es mit einer einfachen Vanilla-Klasse tun würden.

Aber wenn ich mich nicht irre, in C++ (oder war es C#?) Können Sie eine String in einer switch Anweisung verwenden. Daher ist der Vorteil von Enums in Java im Vergleich zu C++ vernachlässigbar. Allerdings wurde das gleiche für Java 7 vorgeschlagen, nicht sicher, ob es es schaffen wird.

6

Java 5 Aufzählungen entstanden aus einem typsicheren Enum-Muster von Joshua Bloch ‚s Effective Java (die ersten Ausgabe) die Tücke von Aufzählungen in C/C++/C# (die einfach kaum verhüllte int Konstanten) und die Verwendung in Java zu vermeiden der endgültigen statischen Int-Konstanten.

Hauptsächlich sind int Konstanten und int enums nicht typsicher. Sie können einen beliebigen int-Wert übergeben. In C/C++ können Sie dies tut:

enum A { one, two, three }; 
enum B { beef, chicken, pork } b = beef; 

void func(A a) { ... } 
func((A)b); 

Leider mußten die typsichere Enum-Muster von Effective Java vielen vorformulierten, nicht alle davon offensichtlich. Am bemerkenswertesten ist, dass Sie die private Methode readResolve überschreiben mussten, um Java zu stoppen, das neue Instanzen bei der Deserialisierung erstellt, die die einfache Referenzprüfung unterbrechen würden (dh unter Verwendung des == Operators anstelle von equals()).

So bieten Java 5 Aufzählungen diese Vorteile gegenüber Ints:

  • Typ Sicherheit;
  • Java 5 Enums können Verhalten haben und Schnittstellen implementieren;
  • Java 5 Enums haben einige extrem leichte Datenstrukturen wie EnumSet und EnumMap.

Java 5 Aufzählungen über diese Vorteile gegenüber nur mit Klassen:

  • weniger fehleranfällig vorformulierten (privat Konstruktor, readResolve() usw.);
  • Semantische Korrektheit. Sie sehen, dass etwas ein Enum ist und Sie wissen, dass es nur einen Wert darstellt. Sie sehen eine Klasse und Sie sind sich nicht sicher. Vielleicht gibt es irgendwo eine statische Fabrik-Methode, etc. Java 5 enums viel deutlicher zeigen Absicht.
+0

Es ist keine große Sache, 'readResolve()' zu überschreiben. Ich mache das regelmäßig für Klassen mit einer endlichen Anzahl von Instanzen. Manchmal vereinfacht 'enum' die Definition dieser Klassen, manchmal nicht. Verwenden Sie das richtige Werkzeug für den Job. – finnw

2

können Sie Aufzählungen verwenden, um effektiv Singletons zu implementieren ^^:

public enum Elvis { 
    INSTANCE 
} 
+1

-1 - Sie sollten Singletons vermeiden, nicht Wege finden, sie "effektiv zu implementieren" (dieser Ansatz übrigens ist Ladezeit Initialisierung, die unglaublich schmerzhaft ist zu debuggen) – kdgregory

+1

Ich wollte nur darauf hinweisen, wenn Sie brauchen/wollen Singletons zu verwenden, ist dies der beste Weg, um in Java zu tun – helpermethod

+9

BTW, Singletons haben ihre Verwendung – helpermethod

0

Vorteile von Aufzählungen verwenden: Ein Objekt kann auf die gleiche Weise erzeugt werden, wie eine Aufzählung zu arbeiten. In der Tat, Enumerationen wurden nicht einmal in der Java-Sprache bis Version 5.0 enthalten. Enumerationen machen den Code jedoch lesbarer und bieten weniger Platz für Programmiererfehler.

OCA Java SE 7 Programmer I Study Guide