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?
Dies sind die Hauptargumente für enum
, EnumMap
und EnumSet
durch kurze Beispiele.
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 ):
Dies sind alle int
, obwohl sie offensichtlich verschiedene konzeptionelle Einheiten darstellen.
Folgendes sind einige schwerwiegende Konsequenzen:
MONDAY = 0;
, SUNDAY = 0;
setzen, dann haben wir MONDAY == SUNDAY
int
ist:
setMonth(JANUARY)
, aber wir können auch setMonth(THURSDAY)
oder setMonth(42)
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):
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:
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:
EnumMap
Hier ist ein Zitat von Effective Java 2nd Edition :
Beziehe niemals einen Wert, der mit
enum
assoziiert ist, von seinemordinal()
; 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 stattdessenEnumMap
. Das allgemeine Prinzip ist, dass Anwendungsprogrammierer selten, wenn überhaupt,Enum.ordinal
verwenden sollten. ( Punkt 33: Verwenden SieEnumMap
anstelle der Ordinalindizierung )
Im Wesentlichen, wo Sie vorher so etwas haben könnten:
%Vor%Jetzt können Sie haben:
%Vor%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:
Mit enum
und EnumSet
kann das in etwa so aussehen:
ordinal()
, jedoch ... EnumSet
! Was Sie als String
/ int
Konstanten vor Java 1.5 definieren würden, sollten Sie jetzt als enums definieren. Zum Beispiel statt:
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.
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)
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%Standardantwort: Alle Java-Entwickler sollten definitiv Effektive Java Second Edition lesen. Es gibt ein Kapitel über enum
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.
Tags und Links java enumeration enums