1. Hintergrund, wie es enum
dazu kam
Heute werden wir eine andere Art von Datentyp in Java untersuchen: enum
. Der Name enum
leitet sich vom Wort Aufzählung ab . Was ist dieser Datentyp und wozu dient er?
Manchmal muss ein Programmierer einen neuen Datentyp erstellen, dessen mögliche Werte auf eine kleine feste Liste beschränkt sind.
Beispielsweise DayOfTheWeek
kann ein Typ nur die Werte MONDAY
, TUESDAY
, WEDNESDAY
, ... annehmen. Insgesamt gibt es 7 Werte. Oder ein Month
Typ kann nur die Werte JANUARY
, FEBRUARY
, MARCH
, ... annehmen. Insgesamt gibt es 12 Werte.
Natürlich können Sie auch Zahlen (den int
Typ) verwenden: 1
— Montag, 2
— Dienstag usw. Aber jemand könnte Ihrer Variablen versehentlich ungültige Werte wie 8
oder zuweisen.0
Es könnte leicht zu einer Situation kommen, in der ein Programmierer denkt, dass die Wochentage (oder Monate im Jahr) bei Null beginnend nummeriert werden, während andere erwarten, dass die Nummerierung bei Eins beginnt usw.
Aus diesem Grund hat Java enum
einen Datentyp eingeführt, der aus einer endlichen Menge von Werten besteht .
2. Einen Typ deklarieren
Die Deklaration eines neuen enum
Datentyps sieht folgendermaßen aus:
enum TypeName
{
VALUE1,
VALUE2,
VALUE3
}
Wo TypeName
steht der Name des neuen Typs (der neuen Klasse) und die möglichen Werte werden durch Kommas getrennt und in geschweifte Klammern eingeschlossen: Value1
, Value2
, Value3
.
Als Beispiel erstellen wir unser eigenes DayOfTheWeek
enum
:
Code | Notiz |
---|---|
|
Neuer Day Typ Montag Dienstag Mittwoch Donnerstag Freitag Samstag Sonntag |
So weisen Sie einer Variablen unseres neuen Typs einen Wert zu:
Day day = Day.MONDAY;
Beispiel:
Code | Notiz |
---|---|
|
Die Bildschirmausgabe wird sein:
|
3. Methoden einerenum
Ein enum
Typ verfügt über mehrere integrierte Methoden, von denen zwei sehr interessant sind:
Die statische values()
Methode gibt ein Array aller Werte des enum
Typs zurück:
Code | Notiz |
---|---|
|
Die days Variable speichert ein Array mit den Werten des Day Typs (7 Elemente). Zeigen Sie den Inhalt des Arrays auf dem Bildschirm an:
|
Die ordinal()
Methode gibt die Ordnungszahl der Konstante zurück. Sie rufen es für einen enum
Wert und nicht für eine enum
Klasse auf:
Code | Konsolenausgabe |
---|---|
|
|
4. Konvertieren in eine Klasse
In Wirklichkeit gibt es hier nichts Magisches. Der Compiler hat uns nur etwas syntaktischen Zucker gegeben. Zur Kompilierungszeit Day
wird die Enumeration in eine gewöhnliche Klasse konvertiert:
Code, vereinfachte Version | Notiz |
---|---|
|
Day Klasse Liste statischer Konstanten Ein Array mit allen Werten der Day Enumeration Eine Variable, die den Wert eines bestimmten Day Objekts speichert Die Day Klasse constructor ist privat, was bedeutet, dass Objekte der Klasse nur innerhalb der Klasse Day erstellt werden können . Die Methode muss für ein Objekt aufgerufen werden. Es gibt den Wert des Objekts zurück – das Feld. Die Methode gibt ein statisches Array mit allen Werten der Klasse zurückDay ordinal Day value Day |
Wenn wir alle statischen Methoden und Variablen aus der Day
Klasse entfernen, erhalten wir Folgendes:
Code | Notiz |
---|---|
|
Die value Variable speichert den Wert des Day Objekts. Day Objekte können nur innerhalb der Day Klasse erstellt werden, da der Konstruktor private . Die ordinal() Methode gibt den Wert value des Day Objekts zurück. |
Mit anderen Worten, hier passiert nichts Unheimliches. Der Compiler erstellt die Day
Klasse, fügt die Konstanten hinzu, die die enum
Werte darstellen, fügt die erforderlichen Methoden hinzu und erstellt den Klassenkonstruktor private
. Wir werden uns etwas später ansehen, wie Konstrukteure funktionieren.
Hoffentlich ist jetzt klar, warum wir einer Variablen auf diese Weise einen Wert zuweisen:
Day day = Day.MONDAY;
MONDAY
ist nur ein statisches Feld (Konstante) in der Day
Klasse. Wenn Sie von außerhalb der Klasse auf statische Methoden und Felder zugreifen, müssen Sie den Klassennamen vor dem Namen des Felds oder der Methode angeben.
5. Weitere Methoden einesenum
Jede enum
Klasse verfügt über mehrere interessante Funktionen.
Konvertieren in und aus einer Zeichenfolge
toString()
Um ein Enum-Objekt in einen String umzuwandeln, müssen Sie seine Methode aufrufen .
String str = Day.MONDAY.toString();
Um in die andere Richtung (von einem String in ein Day
Objekt) zu konvertieren, können Sie die statische valueOf()
Methode verwenden:
Day day = Day.valueOf("MONDAY");
Es ist super praktisch und wird in vielen Fällen hilfreich sein.
Konvertieren in eine Zahl und wieder zurück
enum
Sie wissen bereits, wie Sie ein Objekt in eine Zahl umwandeln : Rufen Sie die ordinal()
Methode auf:
int index = Day.MONDAY.ordinal();
Für die Konvertierung in die andere Richtung (von einer Zahl in ein Day
Objekt) benötigen Sie ein transparenteres Konstrukt:
Day day = Day.values()[2];
Beispiele:
Code | Notiz |
---|---|
|
Montag Holen Sie sich den Index von Montag: 0 Wochentag 2 Tage nach Montag |
Wichtiger Punkt: Da enum
Werte ein fester Satz von Konstanten sind, können sie mit == verglichen werden . Mit anderen Worten: Sie können nicht zwei identische MONDAY
Objekte mit unterschiedlicher Adresse haben. Von jedem Enum-Wert existiert nur eine einzige Instanz. Und das bedeutet, dass der Vergleich von Enum-Variablen mit == immer funktioniert.
6. Hinzufügen eigener Methoden zu einemenum
Da sich eine enum
zur Kompilierungszeit in eine gewöhnliche Klasse verwandelt, können Sie darin Methoden deklarieren. Diese Methoden werden einfach der Klasse hinzugefügt, die der Compiler generiert. Angenommen, wir möchten, dass wir Day enum
statt eines Arrays eine Liste der Enum-Werte zurückgeben.
Dann können wir den folgenden Code hinzufügen:
Code | Notiz |
---|---|
|
Nach der Werteliste ist ein Semikolon erforderlich. Erstellen Sie ein ArrayList Objekt. Fügen Sie die Werte im von der values() Methode zurückgegebenen Array hinzu. Geben Sie die Liste zurück. |
Jetzt kann diese Methode im Code aufgerufen werden:
Code | Notiz |
---|---|
|
Die list Variable speichert eine Liste aller Werte der Day enum . |