Konzept
Der vollständige Name von enum ist die Aufzählung, eine neue Funktion, die in JDK 1.5 eingeführt wird.
In Java ist der vom Schlüsselwort enum modifizierte Typ der Enum -Typ. Die Form ist wie folgt:
Enum Color {rot, grün, blau}Wenn der Enum keine Methode hinzufügt, stand der Umlaufwert standardmäßig mit einem geordneten Wert ab 0. Wenn Sie den Farbaufzählertyp als Beispiel nehmen, sind seine Aufzählungskonstanten rot: 0, grün: 1 und blau: 2 in der Sequenz
Die Vorteile der Aufzählung: Konstanten können auf einheitliche Weise organisiert und verwaltet werden.
Typische Anwendungsszenarien für die Aufzählung: Fehlercodes, Zustandsmaschinen usw.
Die Natur der Aufzählungstypen
Obwohl enum wie ein neuer Datentyp aussieht, ist Enum tatsächlich eine eingeschränkte Klasse und hat eine eigene Methode.
Beim Erstellen einer Enum generiert der Compiler eine verwandte Klasse für Sie, die von java.lang.Enum geerbt wird.
java.lang.Enum Klassenerklärung
public abstract class enum <e erweitert Enum <e >> implementiert vergleichbar <e>, serialisierbar {...}Aufzählungmethoden
In Enum werden einige grundlegende Methoden bereitgestellt:
values() : Gibt eine Reihe von Enum -Instanzen zurück, und die Elemente in diesem Array werden in der Reihenfolge, die sie in Enum deklariert haben, ausschließlich aufrechterhalten.
name() : Gibt den Instanznamen zurück.
ordinal() : Gibt die Bestellung zurück, wenn die Instanz deklariert wird, ab 0.
getDeclaringClass() : Gibt den Enum -Typ zurück, zu dem die Instanz gehört.
equals() : Bestimmt, ob es dasselbe Objekt ist.
Sie können == verwenden, um enum -Instanzen zu vergleichen.
Darüber hinaus implementiert java.lang.Enum die Comparable und Serializable Schnittstellen, sodass auch die Vergleiche () -Methode bereitgestellt wird.
Beispiel: Grundlegende Methoden zur Anzeige von Enum
public class enummethoddemo {enum color {rot, grün, blau;} enum Größe {big, midd =======================================================anden System.out.println ("============== Drucken Sie alle Größe ============================================= S: Größe S: Größe.Values ()) {) as -grün.println (s + ordinal:" ordinal: "ordinal: System.out.println ("Green Name):" + Green.getDeclaringClass); green.equals (color.green)); }}Ausgabe
==================ieben getDeclaringClass (): Klasse org.zp.javase.enumeration.enumdemo $ colorGreen HashCode (): 460141958green vergleicheto color.green: 0green Equals Color
Merkmale der Aufzählung
Die Eigenschaften der Aufzählung werden in einem Satz zusammengefasst:
enum kann nicht nur er erben, sondern auch als reguläre Klasse angesehen werden.
Dieser Satz muss jedoch separat verstanden werden. Lassen Sie uns dies ausführlich erklären.
Aufzählung kann Methoden hinzufügen
Im Konzeptkapitel stand der Umlaufwert standardmäßig mit einem geordneten Wert ab 0. Dann lautet die Frage: Wie Sie dem angezeigten Enum Werte zuweisen.
Java erlaubt nicht die Verwendung von = Werten zuzuordnen, um Konstanten zu verabschieden
Wenn Sie C/C ++ ausgesetzt waren, werden Sie auf jeden Fall an das Zuordnungssymbol = natürlich denken. In C/C ++ - Sprache kann der Enum den Enum -Konstanten mit dem Zuordnungssymbol = zugewiesen werden. Leider ist das Zuordnungssymbol = in der Java -Syntax nicht zulässig.
Beispiel: Aufzählungsdeklaration in C/C ++ - Sprache
typedef enum {ein = 1, zwei, drei = 3, zehn = 10} Zahl;Enum kann gewöhnliche Methoden, statische Methoden, abstrakte Methoden und Konstruktormethoden hinzufügen.
Obwohl Java Instanzen nicht direkt zuweisen kann, hat es eine noch bessere Lösung: Fügen Sie Methoden hinzu, um die Anzeigezuordnungen indirekt zu implementieren.
Beim Erstellen enum können Sie ihm mehrere Methoden hinzufügen und sogar Konstruktoren dazu.
Beachten Sie ein Detail: Wenn Sie eine Methode für eine Aufzählung definieren möchten, müssen Sie am Ende der letzten Instanz des Enum ein Semikolon hinzufügen. Darüber hinaus muss in Enum die Instanz zuerst definiert werden und Felder oder Methoden können nicht vor der Instanz definiert werden. Andernfalls meldet der Compiler einen Fehler.
Beispiel: Zeigen Sie vollständig, wie Sie gewöhnliche Methoden, statische Methoden, abstrakte Methoden und Konstrukt -Methoden in Aufzählungen definieren können
public enum errorCode {ok (0) {public String getDescription () {return "erfolgreich"; }}, Error_a (100) {public String getDescription () {return "Fehler a"; }}, Error_b (200) {public String getDescription () {return "Fehler B"; }}; privater Int -Code; // Konstruktor: Der Konstruktor von Enum kann nur als private Berechtigung deklariert werden oder nicht als private Fehlercode (int -Nummer) {// Constructor this.code = number deklariert werden; } public int getCode () {// Ordinary Method Returncode; } // Gewöhnliche Methode öffentliche abstrakte Zeichenfolge getDescription (); // Abstract -Methode public static void main (String args []) {// statische Methode für (ERRORCODE S: ERRORCODE.VALUES ()) {System.out.println ("Code:" + s.getCode () + ", Beschreibung:" + S.GetDescription (); }}}Hinweis: Das obige Beispiel ist nicht ratsam, nur um zu zeigen, dass die Aufzählung die Definition verschiedener Methoden unterstützt. Hier ist ein vereinfachtes Beispiel
Beispiel: Definition eines Fehlercode -Aufzählungstyps
Die Ausführungsergebnisse dieses Beispiels und das obige Beispiel sind genau gleich.
public enum errorCodeen {OK (0, "Erfolg"), error_a (100, "fehler a"), error_b (200, "error b"); ERRORCODEEN (INT -Nummer, Zeichenfolge Beschreibung) {this.code = number; this.description = Beschreibung; } privater Int -Code; private Zeichenfolge Beschreibung; public int getcode () {return code; } public String getDescription () {Rückgabe Beschreibung; } public static void main (String args []) {// statische Methode für (ERRORCODEEN S: ERRORCODEEN.VALUES ()) {System.out.println ("Code:" + s.getCode () + ", Beschreibung:" + S.GetDescription ()); }}}Aufzählung kann Schnittstellen implementieren
enum kann Schnittstellen wie allgemeine Klassen implementieren.
Es implementiert auch die Fehlercode -Aufzählungsklasse im vorherigen Abschnitt. Durch die Implementierung der Schnittstelle kann sie ihre Methoden einschränken.
public interface inumnenum {int getcode (); String getDescription ();} public enum errorCodeen2 implementiert Inumnenum {OK (0, "Erfolg"), ERROR_A (100, "Fehler A"), ERROR_B (200, "Fehler B"); ERRORCODEEN2 (INT -Nummer, Zeichenfolge Beschreibung) {this.code = number; this.description = Beschreibung; } privater Int -Code; private Zeichenfolge Beschreibung; @Override public int getcode () {return code; } @Override public String getDescription () {Rückgabe Beschreibung; }}Aufzählung kann nicht eröffnet werden
Enum kann eine andere Klasse nicht erben und natürlich kann es nicht eine andere Enum erben.
Da enum tatsächlich aus java.lang.Enum vererbt werden und Java nicht mehrfacher Erbschaft unterstützt, kann Enum andere Klassen nicht erben und natürlich kann es nicht eine andere enum erben.
Aufzählte Anwendungsszenarien
Konstanten organisieren
Vor JDK1.5 war die Definition von Konstanten in Java public static final TYPE a ; in dieser Form. Mit Aufzählungen können Sie Konstanten von Assoziationen organisieren, um den Code lesbarer und sicherer zu gestalten und auch die von Aufzählungen bereitgestellten Methoden zu verwenden.
Aufzählungserklärung Format
Hinweis: Wenn in der Enum keine Methode definiert ist, können Sie nach der letzten Instanz auch ein Komma, Semikolon oder nichts hinzufügen.
Die folgenden drei Deklarationsmethoden sind gleichwertig:
Enum Color {rot, grün, blau} Enum Farbe {rot, grün, blau,} enum Farbe {rot, grün, blau; }STATE -MACHRUNG STATE
Wir verwenden häufig Switch -Anweisungen, um Statusmaschinen zu schreiben. Nach JDK7 hat Switch Parameter von int、char、String、enum -Typen unterstützt. Im Vergleich zu diesen Parametypen ist der Switchcode unter Verwendung von Aufzählungen lesbarer.
Enum -Signal {rot, gelb, grün} öffentliche statische String getTrafficInstruct (Signalsignal) {String Instruct = "Signallichtausfall"; Switch (Signal) {case rot: Instruct = "Rotlichtstopp"; brechen; Case Yellow: Instruct = "Bitte achten Sie auf gelbes Licht"; brechen; Case Green: Instruct = "Green Light Line"; brechen; Standard: Break; } return anweisung;}Aufzählung organisieren
Aufzählungen ähnlicher Typen können über Schnittstellen oder Klassen organisiert werden.
Es ist jedoch im Allgemeinen durch Schnittstelle organisiert.
Der Grund ist: Die Java -Schnittstelle fügt dem Enum -Typ beim Kompilieren automatisch public static Modifikatoren hinzu. Die Java -Klasse fügt beim Kompilieren automatisch einen static Modifikator enum . Hast du den Unterschied gesehen? Das ist richtig, das heißt, enum in der Klasse. Wenn Sie es nicht an public ändern, können Sie in diesem Paket nur darauf zugreifen.
Beispiel: Organisieren Sie Enum in Schnittstellen
öffentliche Schnittstellenpflanze (enum Gemüse implementiert in Tumperenum (Kartoffel "(0," Kartoffel "), Tomate (0," Tomate "); Gemüse (intnummer, Zeichenfolge Beschreibung) {this.code = number; this.description = Beschreibung; } privater Int -Code; private Zeichenfolge Beschreibung; @Override public int getcode () {return 0; } @Override public String getDescription () {return null; }} Enum Fruit implementiert innumnenum {Apple (0, "Apple"), Orange (0, "Orange"), Banane (0, "Banane"); Frucht (int nummer, String Beschreibung) {this.code = number; this.description = Beschreibung; } privater Int -Code; private Zeichenfolge Beschreibung; @Override public int getcode () {return 0; } @Override public String getDescription () {return null; }}}Beispiel: Organisieren Sie Enums in einer Klasse
Dieses Beispiel hat den gleichen Effekt wie das vorherige Beispiel.
public class Plant2 {public enum Gemüse implementiert innumnenum {...} // Der Code weglässt public enum fruit imolterenum {...} // Der Code weglassen}Strategieaufzählung
Eine Aufzählung der Strategie wird in effektivem Java gezeigt. Diese Aufzählung klassifiziert Enumkonstanten durch Aufzählung verschachtelter Aufzählungen.
Obwohl dieser Ansatz nicht so präzise ist wie die Switch -Anweisung, ist er sicherer und flexibler.
Beispiel: Beispiel für die Aufzählung der politischen Aufzählung in Effektviejava
enum payrollday {montag (payType.Weekday), Dienstag (PayType.Weekday), Mittwoch (PayType.Weekday), Donnerstag (PayType.Weekday), Freitag (PayType.Weekday), Samstag (Paytype.Weekday), Sonntag (Paytype.Weekday); private endgültige PayType PayType; Payrollday (payType payType) {this.PayType = payType; } Doppelpay (Doppelstunden, doppelte Payhandlung) {Return payType.pay (stündlich, payrott); } // Policy Enum Private Enum payType {Wochentag {double OvertimePay (Doppelstunden, doppelte Lohnsache) {Rückgabezeit <= stunden_per_shift? 0: (Stunden - Stunden_Per_Shift) * Payrotte / 2; }}, Wochenende {double OvertimePay (Doppelstunden, doppelte Lohnsache) {Rückgabezeiten * Payrate / 2; }}; private statische endgültige int stunden_per_shift = 8; Abstract Double OvertimePay (Double HRS, Double Payrots); Double Pay (Double HourWorked, Double Payrots) {Double Basepay = HOSTSWORKED * PAYRATE; Basispay + OvertimePay (Hourschorken, Gehaltsverhandlungen); }}}prüfen
System.out.println ("Einkommen für Personen, die 8 Stunden lang 100 einen Stundenlohn verdienen:" + payrollday.friday.pay (8.0, 100)); System.out.println ("Einkommen für Personen, die am Samstag 100 Stunden lang 100 Stunden lang verdienen, 8 Stunden lang:" + payrollday.saturday.pay (8.0, 100));Enumset und Enummap
Java bietet zwei Werkzeugkurse, die für den Betrieb von Enumset und Enummap bequem sind.
EnumSet ist eine Set Implementierung von Enumentypen. Es erfordert, dass die darin platzierten Enum -Konstanten demselben Auflauftyp gehören müssen.
EnumMap ist eine Kartenimplementierung, die auf Enum -Typen zugeschnitten ist. Obwohl die Verwendung anderer Map -Implementierungen (z. B. HashMap) auch Enum -Typ -Instanzen zum Wert -Zuordnen vervollständigen kann, ist die Verwendung von ENUMMAP effizienter: Es kann nur Instanzen desselben Enumtyps als Schlüsselwerte empfangen und da die Anzahl der entsprechenden ENUM -Instanzen relativ fest und begrenzt ist. Dies macht Enummap sehr effizient.
// Verwendung von enumSet System.out.println ("EnumSet -Anzeige"); EnumSet <Regellelland> errset = enumSet.Allof (ERRORCODEEN.CLASS); für (errorCodeen e: errset) {System.out.println (e.Name () + ":" + e.ordinal ());} // Verwendung von eNummap system.out.println ("enummap display"); enummap <statemachine.Signal, String> ermap = newna EnumMap(StateMachine.Signal.class);errMap.put(StateMachine.Signal.RED, "Red Light");errMap.put(StateMachine.Signal.YELLOW, "Yellow");errMap.put(StateMachine.Signal.GREEN, "Green Light");for (Iterator<Map.Entry<StateMachine.Signal, String>> iter = Errmap.EntrySet (). iterator (); System.out.println (Eintrag.GeteKey (). Name () + ":" + Eintrag.getValue ());}Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.