CodeGym/Java-Blog/Germany/Die Enum-Klasse in Java
Autor
Milan Vucic
Programming Tutor at Codementor.io

Die Enum-Klasse in Java

Veröffentlicht in der Gruppe Germany
Hallo! In diesem Artikel werden wir dir etwas über Java Enums erzählen. Stell dir vor, du hast die folgende Aufgabe bekommen: Erstelle eine Klasse, die die Wochentage implementiert. Auf den ersten Blick scheint das ziemlich einfach zu sein. Dein Code würde etwa so aussehen:
public class DayOfWeek {

   private String title;

   public DayOfWeek(String title) {
       this.title = title;
   }

   public static void main(String[] args) {
       DayOfWeek dayOfWeek = new DayOfWeek("Saturday");
       System.out.println(dayOfWeek);
   }

   @Override
   public String toString() {
       return "DayOfWeek{" +
               "title='" + title + '\'' +
               '}';
   }
}
Alles scheint völlig in Ordnung, doch es gibt ein Problem: Du kannst einen beliebigen Text an den Konstruktor der DayOfWeek-Klasse übergeben. Das heißt, jemand könnte einen Wochentag namens "Frosch", "Wolke" oder "azaza322" erstellen. Das ist eindeutig nicht das Verhalten, das wir erwarten, denn es gibt nur 7 tatsächliche Wochentage, und jeder von ihnen hat einen bestimmten Namen. Unsere Aufgabe besteht also darin, den Bereich der möglichen Werte für die Klasse DayOfWeek irgendwie einzuschränken. Bevor Java 1.5 herauskam, mussten die Entwickler:innen ihre eigenen Lösungen für dieses Problem erfinden, da die Sprache dafür keine vorgefertigte Lösung hatte. Wenn Programmierer:innen damals die Anzahl der Werte einschränken mussten, taten sie das hier:
public class DayOfWeek {

   private String title;

   private DayOfWeek(String title) {
       this.title = title;
   }

   public static DayOfWeek SUNDAY = new DayOfWeek("Sunday");
   public static DayOfWeek MONDAY = new DayOfWeek("Monday");
   public static DayOfWeek TUESDAY = new DayOfWeek("Tuesday");
   public static DayOfWeek WEDNESDAY = new DayOfWeek("Wednesday");
   public static DayOfWeek THURSDAY = new DayOfWeek("Thursday");
   public static DayOfWeek FRIDAY = new DayOfWeek("Friday");
   public static DayOfWeek SATURDAY = new DayOfWeek("Saturday");

   @Override
   public String toString() {
       return "DayOfWeek{" +
               "title='" + title + '\'' +
               '}';
   }
}
Das solltest du beachten:
  • Der Konstruktor ist private. Wenn ein Konstruktor mit dem Modifikator private gekennzeichnet ist, kann er nicht zur Erstellung eines Objekts verwendet werden. Und da die Klasse nur einen Konstruktor hat, können keine DayOfWeek-Objekte erstellt werden.

    public class Main {
    
       		public static void main(String[] args) {
    
           			DayOfWeek sunday = new DayOfWeek(); // Error!
       		}
    }
  • Natürlich hat die Klasse die erforderliche Anzahl von public static Objekten, die korrekt initialisiert wurden (mit den richtigen Namen der Wochentage).

    Dadurch konnten diese Objekte in anderen Klassen verwendet werden.

    public class Person {
    
       		public static void main(String[] args) {
    
           			DayOfWeek sunday = DayOfWeek.SUNDAY;
    
           			System.out.println(sunday);
      		 }
    }

    Ausgabe:

    DayOfWeek{title = 'Sonntag'}
Mit diesem Vorgehen ist das Problem weitgehend gelöst. Wir haben 7 Wochentage zur Verfügung, und niemand kann neue erschaffen. Diese Lösung wurde von Joshua Bloch in seinem Buch Effective Java angeboten. Das Buch ist übrigens sehr cool und eine Pflichtlektüre für jeden Java-Entwickler und jede Java-Entwicklerin. Mit der Veröffentlichung von Java 1.5 hat die Sprache eine fertige Lösung für solche Situationen erhalten: Java Enums. Enum in Java ist auch eine Klasse. Sie ist speziell auf die Lösung solcher Probleme abgestimmt, d. h. sie erzeugt eine bestimmte eingeschränkte Menge von Werten. Die Erfinder von Java hatten schon fertige Beispiele vorliegen (C besaß zum Beispiel schon enum), also konnten sie die beste Variante entwickeln.

Was ist also Java Enum?

Kommen wir noch einmal auf unser DayOfWeek-Beispiel zurück:
public enum DayOfWeek {

   SUNDAY,
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY
}
Das sieht schon viel einfacher aus :) Intern enthält unser Enum 7 statische Konstanten. Und das können wir bei der Implementierung unseres Programms nutzen. Lass uns zum Beispiel ein Programm schreiben, das feststellt, ob ein Schüler heute zur Schule gehen muss. Unser Schüler hat einen täglichen Stundenplan, der durch die Klasse StudentSchedule repräsentiert wird:
public class StudentSchedule {

   private DayOfWeek dayOfWeek;
   // ... other fields


   public DayOfWeek getDayOfWeek() {
       return dayOfWeek;
   }

   public void setDayOfWeek(DayOfWeek dayOfWeek) {
       this.dayOfWeek = dayOfWeek;
   }
}
Die Variable dayOfWeek des Stundenplanobjekts bestimmt, welcher Tag heute ist. Und hier ist unsere Schüler-Klasse:
public class Student {

   private StudentSchedule schedule;
   private boolean goToSchool;

   public void wakeUp() {

       if (this.schedule.getDayOfWeek() == DayOfWeek.SUNDAY) {
           System.out.println("Hooray, you can sleep more!");
       } else {
           System.out.println("Damn, time for school again :(");
       }
   }
}
In der Methode wakeUp() verwenden wir Java Enum, um zu bestimmen, was der Schüler als Nächstes tun soll. Wir haben nicht einmal Details zu den einzelnen Feldern in DayOfWeek angegeben, und das ist auch überhaupt nicht nötig: Es ist offensichtlich, wie die Wochentage funktionieren sollen. Wenn wir das nun in seiner jetzigen Form verwenden, würde jeder Entwickler und jede Entwicklerin verstehen, was in unserem Code passiert. Ein weiteres Beispiel für die Praxistauglichkeit von Enum ist, dass ihre Konstanten mit der switch-Anweisung verwendet werden können. Schreiben wir zum Beispiel ein Programm für eine strenge Diät, in dem die Gerichte nach Tagen geplant werden:
public class VeryStrictDiet {
   public void takeLunch(DayOfWeek dayOfWeek) {
       switch (dayOfWeek) {
           case SUNDAY:
               System.out.println("Sunday Dinner! You can even enjoy something a little sweet today.");
               break;
           case MONDAY:
               System.out.println("Lunch for Monday: chicken noodle soup!");
               break;
           case TUESDAY:
               System.out.println("Tuesday, today it's celery soup :(");
               break;
               //... and so on to the end
       }
   }
}
Dies ist einer der Vorteile von Enums gegenüber der alten Lösung, die vor Java 1.5 verwendet wurde – die alte Lösung konnte nicht mit switch verwendet werden. Was du sonst noch wissen musst Enum? Enum ist eine echte Klasse mit all den Möglichkeiten, die das mit sich bringt. Wenn zum Beispiel die aktuelle Implementierung der Wochentage unzureichend ist, kannst du Variablen, Konstruktoren und Methoden zu DayOfWeek hinzufügen:
public enum DayOfWeek {

   SUNDAY ("Sunday"),
   MONDAY ("Monday"),
   TUESDAY ("Tuesday"),
   WEDNESDAY ("Wednesday"),
   THURSDAY ("Thursday"),
   FRIDAY ("Friday"),
   SATURDAY ("Saturday");

   private String title;

   DayOfWeek(String title) {
       this.title = title;
   }

   public String getTitle() {
       return title;
   }

   @Override
   public String toString() {
       return "DayOfWeek{" +
               "title='" + title + '\'' +
               '}';
   }
}
Jetzt haben unsere Enum-Konstanten ein title-Feld, einen Getter und eine überschriebene toString-Methode. Im Vergleich zu normalen Klassen wurde Enum eine schwerwiegende Beschränkung auferlegt – sie kann nicht vererbt werden. Außerdem haben Aufzählungen (Enums) charakteristische Methoden:
  • values(): gibt ein Array mit allen Werten im Enumzurück:

    public static void main(String[] args) {
       		System.out.println(Arrays.toString(DayOfWeek.values()));
    }

    Ausgabe:

    [DayOfWeek{title = 'Sonntag'}, DayOfWeek{title = 'Montag'}, DayOfWeek{title = 'Dienstag'}, DayOfWeek{title = 'Mittwoch'}, DayOfWeek{title = 'Donnerstag'}, DayOfWeek{title = 'Freitag'}, DayOfWeek{title = 'Samstag'}]
  • ordinal(): gibt die Ordnungszahl der Konstante zurück. Die Nummerierung beginnt bei Null:

    public static void main(String[] args) {
    
       		int sundayIndex = DayOfWeek.SUNDAY.ordinal();
       		System.out.println(sundayIndex);
    }

    Ausgabe:

    0
  • valueOf(): gibt das Enum-Objekt zurück, das dem übergebenen Namen entspricht:

    public static void main(String[] args) {
       DayOfWeek sunday = DayOfWeek.valueOf("SUNDAY");
       System.out.println(sunday);
    }

    Ausgabe:

    DayOfWeek{title = 'Sonntag'}
Hinweis: Wir verwenden Großbuchstaben, um Enum-Felder anzugeben. Da es sich um Konstanten handelt, werden sie in Großbuchstaben geschrieben und nicht in camelCase.
Kommentare
  • Beliebt
  • Neu
  • Alt
Du musst angemeldet sein, um einen Kommentar schreiben zu können
Auf dieser Seite gibt es noch keine Kommentare