1. Hintergrund, wie es enumdazu kam

Heute werden wir eine andere Art von Datentyp in Java untersuchen: enum. Der Name enumleitet 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 DayOfTheWeekkann ein Typ nur die Werte MONDAY, TUESDAY, WEDNESDAY, ... annehmen. Insgesamt gibt es 7 Werte. Oder ein MonthTyp kann nur die Werte JANUARY, FEBRUARY, MARCH, ... annehmen. Insgesamt gibt es 12 Werte.

Natürlich können Sie auch Zahlen (den intTyp) verwenden: 1— Montag, 2— Dienstag usw. Aber jemand könnte Ihrer Variablen versehentlich ungültige Werte wie 8oder 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 enumeinen Datentyp eingeführt, der aus einer endlichen Menge von Werten besteht .


2. Einen Typ deklarieren

Die Deklaration eines neuen enumDatentyps sieht folgendermaßen aus:

enum TypeName
{
   VALUE1,
   VALUE2,
   VALUE3
}

Wo TypeNamesteht 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
enum Day
{
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY,
   SUNDAY
}
Neuer DayTyp

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
Day day = Day.FRIDAY;
System.out.println(day);
Die Bildschirmausgabe wird sein:
FRIDAY


3. Methoden einerenum

Ein enumTyp verfügt über mehrere integrierte Methoden, von denen zwei sehr interessant sind:

Die statische values()Methode gibt ein Array aller Werte des enumTyps zurück:

Code Notiz
Day[] days = Day.values();

for (Day day: days)
   System.out.println(day);







System.out.println(days[2]);
Die daysVariable speichert ein Array mit den Werten des DayTyps (7 Elemente).

Zeigen Sie den Inhalt des Arrays auf dem Bildschirm an:
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY

WEDNESDAY

Die ordinal()Methode gibt die Ordnungszahl der Konstante zurück. Sie rufen es für einen enumWert und nicht für eine enumKlasse auf:

Code Konsolenausgabe
System.out.println(Day.MONDAY.ordinal());
System.out.println(Day.FRIDAY.ordinal());
System.out.println(Day.SUNDAY.ordinal());
0
4
6


4. Konvertieren in eine Klasse

In Wirklichkeit gibt es hier nichts Magisches. Der Compiler hat uns nur etwas syntaktischen Zucker gegeben. Zur Kompilierungszeit Daywird die Enumeration in eine gewöhnliche Klasse konvertiert:

Code, vereinfachte Version Notiz
public class Day
{
   public static final Day MONDAY = new Day(0);
   public static final Day TUESDAY = new Day(1);
   public static final Day WEDNESDAY = new Day(2);
   public static final Day THURSDAY = new Day(3);
   public static final Day FRIDAY = new Day(4);
   public static final Day SATURDAY = new Day(5);
   public static final Day SUNDAY = new Day(6);

    private static final Day[] array = {MONDAY, TUESDAY,
      WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY};

   private final int value;

   private Day (int value)
   {
      this.value = value;
   }

   public int ordinal()
   {
      return this.value;
   }

   public static Day[] values()
   {
      return array;
   }
}
DayKlasse

Liste statischer Konstanten







Ein Array mit allen Werten der DayEnumeration


Eine Variable, die den Wert eines bestimmten DayObjekts speichert

Die DayKlasse constructorist privat, was bedeutet, dass Objekte der Klasse nur innerhalb der Klasse Dayerstellt 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



ordinalDay

value


Day

Wenn wir alle statischen Methoden und Variablen aus der DayKlasse entfernen, erhalten wir Folgendes:

Code Notiz
public class Day
{
  private int value;

  private Day (int value)
  {
    this.value = value;
  }

  public int ordinal()
  {
    return this.value;
  }
}


Die valueVariable speichert den Wert des DayObjekts.

DayObjekte können nur innerhalb der DayKlasse erstellt werden, da der Konstruktor private.




Die ordinal()Methode gibt den Wert valuedes DayObjekts zurück.

Mit anderen Worten, hier passiert nichts Unheimliches. Der Compiler erstellt die DayKlasse, fügt die Konstanten hinzu, die die enumWerte 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;

MONDAYist nur ein statisches Feld (Konstante) in der DayKlasse. 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 enumKlasse 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 DayObjekt) 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

enumSie 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 DayObjekt) benötigen Sie ein transparenteres Konstrukt:

Day day = Day.values()[2];

Beispiele:

Code Notiz
Day day = Day.MONDAY;
int index = day.ordinal();
Day newDay = Day.values()[index+2];
Montag
Holen Sie sich den Index von Montag: 0
Wochentag 2 Tage nach Montag

Wichtiger Punkt: Da enumWerte ein fester Satz von Konstanten sind, können sie mit == verglichen werden . Mit anderen Worten: Sie können nicht zwei identische MONDAYObjekte 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 enumzur 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 enumstatt eines Arrays eine Liste der Enum-Werte zurückgeben.

Dann können wir den folgenden Code hinzufügen:

Code Notiz
enum Day
{
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY,
   SUNDAY;

   public static List<Day> asList()
   {
      ArrayList<Day> list = new ArrayList<Day>();

      Collections.addAll(list, values());

      return list;
   }

}








Nach der Werteliste ist ein Semikolon erforderlich.



Erstellen Sie ein ArrayListObjekt.

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
List<Day> list = Day.asList();
Die listVariable speichert eine Liste aller Werte der Day enum.