Enums (Aufzählungstypen in Java)
Kurzüberblick / Definition¶
Enums (Enumerations) sind spezielle Klassen in Java, die eine feste Menge vordefinierter Konstanten darstellen.
- Jede Konstante ist ein Objekt
- Enums sind typsicher
- Können Attribute, Konstruktoren und Methoden enthalten
- Verhindern ungültige Werte (z. B. falsche Strings oder Zahlen)
Core-Erklärung¶
Das eigentliche Problem (Praxisblick)¶
Ohne Enums wird oft so gearbeitet:
String status = "OPEN";
Probleme:
- Tippfehler (
"OPNE") → Laufzeitfehler - Keine Einschränkung der erlaubten Werte
- Schlechte Wartbarkeit
- Kein Compiler-Schutz
Lösung: Enum als fachliches Modell¶
public enum OrderStatus {
OPEN,
PROCESSING,
SHIPPED,
DELIVERED,
CANCELLED
}
Verwendung:
OrderStatus status = OrderStatus.OPEN;
➡️ Der Compiler erzwingt gültige Werte
➡️ Der Code beschreibt fachliche Zustände klar und eindeutig
Mentales Modell (entscheidend)¶
Ein Enum ist nicht nur eine Liste von Werten.
👉 Ein Enum ist ein Modell eines festen Zustandsraums eines Systems.
Beispiele:
- Bestellung → Status
- Benutzer → Rolle
- Zahlung → Methode
- Prozess → Zustand
Praxisbeispiele (Realistisch & prüfungsrelevant)¶
1. Bestellstatus im Online-Shop¶
public enum OrderStatus {
OPEN,
PROCESSING,
SHIPPED,
DELIVERED,
CANCELLED
}
public class Order {
private OrderStatus status;
public Order(OrderStatus status) {
this.status = status;
}
public void printStatus() {
System.out.println("Status: " + status);
}
}
2. Benutzerrollen (Security / Rechte)¶
public enum UserRole {
ADMIN,
USER,
GUEST
}
public class User {
private UserRole role;
public boolean canDelete() {
return role == UserRole.ADMIN;
}
}
➡️ Vergleich mit == ist korrekt, da Enum-Konstanten Singleton-Objekte sind
3. Versandkosten (Daten + Verhalten)¶
public enum ShippingType {
STANDARD(4.99),
EXPRESS(9.99),
OVERNIGHT(19.99);
private final double cost;
ShippingType(double cost) {
this.cost = cost;
}
public double getCost() {
return cost;
}
}
➡️ Enum bündelt Daten und Bedeutung
4. Verhalten pro Zustand (State Pattern light)¶
public enum OrderStatus {
OPEN {
@Override
public boolean canBeCancelled() {
return true;
}
},
SHIPPED {
@Override
public boolean canBeCancelled() {
return false;
}
};
public abstract boolean canBeCancelled();
}
Verwendung:
if (order.getStatus().canBeCancelled()) {
// Bestellung stornieren
}
➡️ Logik gehört direkt zum Zustand
5. Typischer Enterprise-Use-Case: API / DTO¶
public enum HttpMethod {
GET,
POST,
PUT,
DELETE
}
public void sendRequest(HttpMethod method) {
if (method == HttpMethod.POST) {
// body required
}
}
➡️ Verhindert ungültige API-Aufrufe
Wichtige Konzepte¶
Enums sind vollwertige Klassen¶
Ein Enum entspricht intern etwa:
public final class OrderStatus extends Enum<OrderStatus>
Eigenschaften:
- Konstruktoren sind immer
private - Jede Konstante ist eine Instanz
- Vergleich mit
==möglich und korrekt
Nützliche Methoden¶
OrderStatus status = OrderStatus.valueOf("OPEN");
OrderStatus[] values = OrderStatus.values();
String name = status.name();
int ordinal = status.ordinal();
⚠️ ordinal() sollte nicht für Logik verwendet werden (unstabil bei Änderungen)
Verwendung in switch¶
switch (status) {
case OPEN -> System.out.println("Offen");
case SHIPPED -> System.out.println("Versendet");
default -> System.out.println("Andere");
}
Entscheidungslogik (sehr wichtig)¶
Verwende ein Enum wenn:¶
- Werte sind fest definiert
- Werte ändern sich selten
- Werte haben fachliche Bedeutung
Verwende KEIN Enum wenn:¶
- Werte sind dynamisch (z. B. Benutzernamen)
- Werte kommen aus Datenbank/API
- Unbekannte Anzahl an Möglichkeiten
Vergleich: Enum vs String¶
| Kriterium | String | Enum |
|---|---|---|
| Typsicherheit | ❌ Nein | ✅ Ja |
| Compilerprüfung | ❌ Nein | ✅ Ja |
| Lesbarkeit | ⚠️ Mittel | ✅ Hoch |
| Wartbarkeit | ❌ Schlecht | ✅ Gut |
Exam-Relevanz¶
Typische Fragen:
- Definition eines Enums
- Vorteile gegenüber String/int
- Können Enums Methoden enthalten?
- Bedeutung von Typsicherheit
- Verwendung in
switch - Warum ist
==erlaubt?
Best Practices¶
Verwenden für:
- Zustände (OrderStatus, TicketStatus)
- Rollen (UserRole)
- Konfigurationen (PaymentType, ShippingType)
Vermeiden:
- Business-Logik überladen
- Verwendung von
ordinal()für Logik - Einsatz bei dynamischen Daten
Häufige Fehler¶
❌ Strings statt Enum verwenden
→ Keine Typsicherheit
❌ Enum nur als Konstantensammlung sehen
→ Verhalten wird nicht genutzt
❌ Zu komplexe Logik im Enum
→ Verletzt Separation of Concerns
❌ Vergleich mit .equals() statt ==
→ Unnötig und schlechter Stil
Fazit¶
Enums sind ein zentrales Werkzeug für sauberes Java-Design:
- Modellieren klare, feste Zustände
- Erzwingen korrekte Verwendung durch den Compiler
- Verbessern Lesbarkeit und Wartbarkeit
Merksatz¶
Ein Enum ist keine Liste von Werten,
sondern ein typsicheres Modell eines festen Zustandsraums in deinem System.