Aufzählungen: Warum? Wann?

7

Ich bin ein fast graduierender Informatikstudent, und während meiner gesamten Codierkarriere habe ich sehr wenige Fälle gefunden, in denen Aufzählungen, außer für kanonische Fälle wie das Darstellen der Gesichter eines Standardkartenspiels, verwendet werden.

Kennst du irgendwelche cleveren Methoden, mit denen Enums im täglichen Coding verwendet werden?

Warum sind Aufzählungen so wichtig und in welchen Situationen sollte man erkennen können, dass das Aufstellen einer Aufzählung der beste Ansatz ist?

    
danyim 29.07.2010, 13:43
quelle

7 Antworten

29

Dies sind die Hauptargumente für enum , EnumMap und EnumSet durch kurze Beispiele.

Der Fall für enum

Ab Java 6 ist java.util.Calendar ein Beispiel einer unordentlichen Klasse, die viel von enum (neben anderen Verbesserungen) hätte profitieren können.

Derzeit definiert Calendar die folgenden Konstanten ( unter vielen anderen ):

%Vor%

Dies sind alle int , obwohl sie offensichtlich verschiedene konzeptionelle Einheiten darstellen.

Folgendes sind einige schwerwiegende Konsequenzen:

  • Es ist spröde ; Es muss darauf geachtet werden, dass bei Bedarf verschiedene Nummern vergeben werden.
    • Wenn wir versehentlich MONDAY = 0; , SUNDAY = 0; setzen, dann haben wir MONDAY == SUNDAY
  • Es gibt keinen Namensraum und keine Typsicherheit , da alles nur ein int ist:
    • Wir können setMonth(JANUARY) , aber wir können auch setMonth(THURSDAY) oder setMonth(42)
    • Wer weiß, was set(int,int,int,int,int,int) (eine echte Methode!) Tut!

Im Gegensatz dazu könnten wir stattdessen so etwas haben:

%Vor%

Jetzt müssen wir uns nie mehr um MONDAY == SUNDAY kümmern (das kann niemals passieren!), und da Month und DayOfWeek unterschiedliche Typen sind, kompiliert setMonth(MONDAY) nicht.

Zusätzlich sind hier einige Vorher-Nachher-Codes:

%Vor%

Hier machen wir alle möglichen Annahmen, z.B. JANUARY + 1 == FEBRUARY , etc. Andererseits ist das enum Pendant sowohl prägnanter als auch lesbarer und macht weniger Annahmen (und damit weniger Fehlermöglichkeiten):

%Vor%

Der Fall für Instanzfelder

In Java ist enum ein class , das viele spezielle Eigenschaften hat, aber trotzdem eine class , die es Ihnen ermöglicht, bei Bedarf Instanzmethoden und Felder zu definieren.

Betrachten Sie das folgende Beispiel:

%Vor%

Auf der anderen Seite können Sie mit enum etwas schreiben:

%Vor%

Der Fall für Beispielmethoden

Betrachten Sie das folgende Beispiel:

%Vor%

Wie im vorherigen Beispiel gezeigt, kann enum in Java Instanzmethoden haben, aber nicht nur das, sondern jede Konstante kann auch ihre eigene spezifische @Override haben. Dies wird im folgenden Code angezeigt:

%Vor%

Der Fall für EnumMap

Hier ist ein Zitat von Effective Java 2nd Edition :

  

Beziehe niemals einen Wert, der mit enum assoziiert ist, von seinem ordinal() ; Speichern Sie es stattdessen in einem Instanzfeld. ( Punkt 31: Verwenden von Instanzfeldern anstelle von Ordinalzahlen ) Es ist selten sinnvoll, Ordnungszahlen zum Indexieren von Arrays zu verwenden: Verwenden Sie stattdessen EnumMap . Das allgemeine Prinzip ist, dass Anwendungsprogrammierer selten, wenn überhaupt, Enum.ordinal verwenden sollten. ( Punkt 33: Verwenden Sie EnumMap anstelle der Ordinalindizierung )

Im Wesentlichen, wo Sie vorher so etwas haben könnten:

%Vor%

Jetzt können Sie haben:

%Vor%

Der Fall für EnumSet

Die Leistung von zwei int -Konstanten wird oft z.B. in C ++, um Bitmengen zu bezeichnen. Dies beruht auf bitweisen Operationen . Ein Beispiel könnte etwa so aussehen:

%Vor%

Mit enum und EnumSet kann das in etwa so aussehen:

%Vor%

Referenzen

Siehe auch

  • Effektive Java 2nd Edition
    • Punkt 30: Verwenden Sie enum anstelle von int Konstanten
    • Punkt 31: Verwenden Sie Instanzfelder anstelle von Ordinalzahlen
    • Punkt 32: Verwenden Sie anstelle von Bitfeldern EnumSet
    • Tipp 33: Verwenden Sie anstelle der ordinalen Indizierung EnumMap

Verwandte Fragen

polygenelubricants 29.07.2010, 14:08
quelle
7

Was Sie als String / int Konstanten vor Java 1.5 definieren würden, sollten Sie jetzt als enums definieren. Zum Beispiel statt:

%Vor%

Sie sind jetzt sicherer und entwicklerfreundlicher:

%Vor%

Gleiches gilt für alles, was mehr als eine Option hat, wie Status, Straßentypen (str., boul., rd. usw.), Benutzerzugriffsebenen (Administrator, Moderator, regulärer Benutzer), etc. etc.

für weitere Beispiele und Erklärungen.

    
Bozho 29.07.2010 13:47
quelle
5

Betrachten Sie einen einfachen Code:

ohne enums:

%Vor%

Das sieht gut aus, oder? Außer SetOptions () will Option B zuerst und dann Option A. Dies wird durch den Compiler gut gehen, aber beim Ausführen, setzt die Optionen zurück.

Jetzt mit enums:

%Vor%

Nun machen wir denselben Fehler, aber dieses Mal, da Enums verschiedene Typen sind, wird der Fehler vom Compiler abgefangen.

(HINWEIS: Ich bin kein Java-Programmierer, bitte vergib kleinere Syntaxfehler)

    
James Curran 29.07.2010 13:57
quelle
3

Ich denke, Sie sprechen von Enumerations, nicht Enumerators.

Aufzählungen eignen sich gut für überall in Ihrer Anwendung, wo Sie sonst "magische Zeichenfolgen" oder "magische Zahlen" verwenden könnten.

Der einfachste Bereich, um ihre Verwendung zu verstehen, ist im Dateizugriff. Jeder Dateizugriffsmodus (Lesen, Schreiben, Anhängen) wird in der Aufzählung dargestellt. Wenn Sie "magische Zahlen" verwenden, haben Sie möglicherweise etwas, das wie folgt aussieht:

%Vor%

Wenn Sie die Absicht mit einer Aufzählung viel deutlicher und prägnanter ausdrücken könnten:

%Vor%     
Justin Niessner 29.07.2010 13:46
quelle
2

Standardantwort: Alle Java-Entwickler sollten definitiv Effektive Java Second Edition lesen. Es gibt ein Kapitel über enum

    
Manuel Selva 29.07.2010 13:47
quelle
2

Aufzählungen sind perfekt, um den Status / Status von etwas darzustellen. Ich verwende oft enums wie:

%Vor%

Es gibt immer ein Gleichgewicht zwischen Aufzählungen und abgeleiteten Klassen. Um ein einfaches Beispiel zu geben, betrachten Sie eine Cat -Klasse. Cats haben unterschiedliche Feindseligkeiten. Also könnten wir abgeleitete Klassen machen HostileCat , FriendlyCat , etc. Es gibt aber auch verschiedene Arten von Katzen, Lions , Tigers , usw. Plötzlich haben wir eine ganze Menge Cat Objects. Eine alternative Lösung besteht also darin, eine Hostility -Enumeration in der Klasse Cat bereitzustellen, die die Anzahl der abgeleiteten Klassen und die Gesamtkomplexität reduziert.

    
Justin Ardini 29.07.2010 13:57
quelle
1

Wie Manuel Selva vorgeschlagen hat, lesen Sie Effective Java Second Edition , lesen Sie aber auch den Singleton-Abschnitt. Die Verwendung von enum ist der einfachste Weg, um ein sauberes Singleton-Objekt zu erhalten .

    
nanda 29.07.2010 13:57
quelle

Tags und Links