1. Einführung
In der Programmierung arbeitet man oft mit Listen von im Voraus bekannten, begrenzten Optionen. Zum Beispiel: Wochentage, Ampelfarben, Spielschwierigkeitsgrade, Bestellstatus. Jede dieser Optionen ist üblicherweise durch einen festen Wert repräsentiert. Damit kommen wir näher an unser heutiges Thema heran – Aufzählungen (enum).
Eine Aufzählung ist ein spezieller Datentyp, mit dem man eine Menge benannter Konstanten deklarieren kann.
enum – wie eine Schachtel mit nach Fächern sortierten Etiketten, wobei jedes Etikett ein eindeutiger Name ist, der mit einer Zahl verknüpft ist.
Die Hauptvorteile von enum:
- Ihr Code wird lesbar und selbstdokumentierend;
- Anstelle mysteriöser „magischer Zahlen“ wie 0, 1, 2 erscheinen aussagekräftige Namen: DayOfWeek.MONDAY oder TrafficLight.RED;
- Der Compiler meldet einen Fehler, wenn Sie versuchen, einen ungültigen Wert zuzuweisen;
- Hinter jedem Element verbirgt sich … eine gewöhnliche Ganzzahl! (Darauf kommen wir noch zurück.)
Syntax der enum-Deklaration
// Allgemeine Vorlage für die Deklaration eines Aufzählungstyps
public enum Imya
{
KONSTANTA1 ,
KONSTANTA2 ,
KONSTANTA3
}
Ein Aufzählungstyp in Java zu deklarieren ist sehr einfach. Hier ein einfaches Beispiel:
// Datei DayOfWeek.java
public enum DayOfWeek {
MONDAY, // 0
TUESDAY, // 1
WEDNESDAY, // 2
THURSDAY, // 3
FRIDAY, // 4
SATURDAY, // 5
SUNDAY // 6
}
Erläuterung:
- Das Schlüsselwort enum sagt dem Compiler: „Das ist eine Aufzählung!“
- In geschweiften Klammern folgen die Namen der Varianten (Konstanten), durch Kommas getrennt.
- Es ist üblich, die Namen im UPPER_SNAKE_CASE zu schreiben (alle Buchstaben groß, Wörter durch Unterstrich getrennt).
Wo kann man ein enum deklarieren?
- In einer separaten Datei (DayOfWeek.java).
- Innerhalb einer Klasse (wenn die Aufzählung nur für diese Klasse privat sein soll).
- Sogar innerhalb einer Methode (das macht man jedoch selten).
2. Verwendung von enum im Code
Deklaration einer enum-Variablen:
DayOfWeek today = DayOfWeek.MONDAY;
Jetzt kann today nur einen der in DayOfWeek deklarierten Werte annehmen.
Beispielverwendung in switch
switch (today)
{
case MONDAY:
System.out.println("Ach, Montag...");
break;
case FRIDAY:
System.out.println("Hurra, Freitag!");
break;
default:
System.out.println("Ein gewöhnlicher Tag.");
}
Wichtiger Unterschied: In case schreiben wir nur den Konstantennamen (ohne Präfix), wenn der Typ der Variablen dem Compiler bereits bekannt ist.
Alle Werte eines enum durchlaufen
Jedes enum hat die statische Methode values(), die ein Array aller Werte zurückgibt:
for (DayOfWeek day : DayOfWeek.values())
{
System.out.println(day);
}
Das ist sehr praktisch für die Ausgabe von Menüs, Validierungen, Generierung von Optionen usw.
3. Methoden eines enum: name(), ordinal(), valueOf()
Aufzählungen in Java sind nicht nur Listen von Konstanten, sondern vollwertige Klassen mit Methoden!
Methode name()
Gibt den Konstantennamen als String zurück (so, wie er im Code geschrieben ist):
DayOfWeek day = DayOfWeek.FRIDAY;
System.out.println(day.name()); // "FRIDAY"
Methode ordinal()
Gibt die Ordnungszahl der Konstante zurück (Beginn bei null):
System.out.println(DayOfWeek.MONDAY.ordinal()); // 0
System.out.println(DayOfWeek.FRIDAY.ordinal()); // 4
Achtung: Man sollte Enums nicht über ordinal() speichern oder vergleichen, wenn sich die Reihenfolge in Zukunft ändern könnte! Verwenden Sie lieber die Namen.
Methode valueOf(String name)
Wandelt eine Zeichenkette in einen enum-Wert um, sofern eine solche Konstante existiert:
DayOfWeek day = DayOfWeek.valueOf("MONDAY");
System.out.println(day); // MONDAY
Wenn die Zeichenkette nicht übereinstimmt, wird eine IllegalArgumentException ausgelöst.
Methode values()
Liefert ein Array aller enum-Werte (Beispiel siehe oben):
DayOfWeek[] days = DayOfWeek.values();
4. Enum mit Feldern, Konstruktor und Methoden
Aufzählungen in Java lassen sich erweitern: Felder, Konstruktoren, Methoden hinzufügen! Ja, es ist nicht nur eine Liste von Namen, sondern eine kleine Klasse.
Beispiel: Wochentage mit lokalisiertem Namen
public enum DayOfWeek
{
MONDAY("Montag"),
TUESDAY("Dienstag"),
WEDNESDAY("Mittwoch"),
THURSDAY("Donnerstag"),
FRIDAY("Freitag"),
SATURDAY("Samstag"),
SUNDAY("Sonntag");
private final String russianName;
// Konstruktor (standardmäßig private)
DayOfWeek(String russianName)
{
this.russianName = russianName;
}
public String getRussianName()
{
return russianName;
}
}
Mehr Details dazu erfahren Sie, wenn wir ab Level 27+ mit OOP beginnen :P
Jetzt kann man Folgendes tun:
DayOfWeek day = DayOfWeek.WEDNESDAY;
System.out.println(day.getRussianName()); // "Mittwoch"
Clou: Jedes enum-Element hat seine eigenen Daten (in diesem Fall – der lokalisierte Name).
Vorteile der Verwendung von enum
- Typensicherheit: Man kann einer enum-Variablen nicht versehentlich einen Wert zuweisen, der nicht in der Liste steht.
- Lesbarkeit: Der Code dokumentiert sich selbst (TrafficLight.RED statt 1 oder "red").
- Wartungsfreundlichkeit: Wenn eine Variante hinzugefügt oder entfernt werden soll, geschieht das an einer Stelle.
- Funktioniert mit switch: enum eignet sich ideal für Verzweigungen nach Werten.
- Erweiterbar: Felder hinzufügen, Methoden definieren, Interfaces implementieren.
- Weniger Fehler: Der Compiler hilft, keine Varianten zu vergessen (besonders in switch-Konstruktionen).
6. Praxis: Wir verwenden enum in unserer Anwendung
Lassen Sie uns in unsere Mini-Anwendung die Unterstützung für Wochentage via enum einbauen.
Schritt 1. Enum deklarieren
public enum DayOfWeek
{
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
Schritt 2. Im Code verwenden
System.out.println("Geben Sie einen Wochentag ein (z. B. MONDAY):");
Scanner console = new Scanner(System.in);
String input = console.nextLine().toUpperCase();
DayOfWeek day = DayOfWeek.valueOf(input);
switch (day)
{
case MONDAY:
System.out.println("Beginn der Arbeitswoche!");
break;
case FRIDAY:
System.out.println("Bald ist Wochenende!");
break;
case SATURDAY:
case SUNDAY:
System.out.println("Hurra, Wochenende!");
break;
default:
System.out.println("Ein gewöhnlicher Arbeitstag.");
}
Was passiert:
- Der Benutzer gibt den Wochentag ein (z. B. "monday" oder "MONDAY").
- Wir wandeln die Zeichenkette in Großbuchstaben um (toUpperCase()), um unabhängig von der Groß-/Kleinschreibung zu sein.
- Wir wandeln die Zeichenkette per valueOf in einen enum-Wert um.
- Wir verwenden switch, um unterschiedliche Meldungen auszugeben.
- Wenn etwas Ungültiges eingegeben wurde – fangen wir den Fehler ab und geben eine Warnung aus.
7. Typische Fehler beim Arbeiten mit enum
Fehler Nr. 1: Verwendung von Zeichenketten oder Zahlen statt enum. Sehr häufig schreiben Anfänger weiterhin so:
int day = 1; // 1 – ist das Montag?
oder
String status = "DELIVERED";
Das ist schlecht: Man kann sich leicht vertippen, und der Code ist schwer zu warten. Verwenden Sie enum!
Fehler Nr. 2: Vergleich von enum mit == und .equals(). In Java können enum-Werte mit == verglichen werden – das ist sicher, weil alle Werte innerhalb der enum-Klasse eindeutig sind:
if (day == DayOfWeek.MONDAY) { ... } // OK!
Zwar funktioniert .equals() ebenfalls, aber häufiger verwendet man ==.
Fehler Nr. 3: Schlechte Namen für enum-Elemente. Benennen Sie Elemente nicht VALUE1, VALUE2, VALUE3 – in einem Monat weiß niemand mehr, was das heißt! Verwenden Sie aussagekräftige Namen.
Fehler Nr. 4: Verwendung von ordinal() für Logik. Schreiben Sie nicht so:
if (day.ordinal() == 0) { ... } // Nicht machen!
Die Reihenfolge der Elemente kann sich ändern, und dann geht alles kaputt. Verwenden Sie die Namen!
GO TO FULL VERSION