Enums und Enum-Methoden
Teil des Abschnitts Objektorientierte Programmierung der Java-Journey von Coddy. Lektion 50 von 87.
Ein enum (Aufzählung) ist ein spezieller Klassentyp, der eine feste Menge von Konstanten darstellt. Anstatt beliebige Ganzzahlen oder Zeichenfolgen zu verwenden, um Optionen wie Wochentage oder Bestellstatus darzustellen, bieten Enums typsichere, gut lesbare Werte.
enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
Day today = Day.MONDAY;
System.out.println(today); // Gibt aus: MONDAYEnums sind mehr als einfache Konstanten: Sie sind vollständige Klassen. Du kannst ihnen Felder, Konstruktoren und Methoden hinzufügen:
enum Size {
SMALL(10), MEDIUM(20), LARGE(30);
private int price;
Size(int price) {
this.price = price;
}
public int getPrice() {
return price;
}
}
System.out.println(Size.MEDIUM.getPrice()); // Gibt aus: 20Jedes Enum verfügt über nützliche integrierte Methoden. Die Methode values() gibt ein Array aller Konstanten zurück, während valueOf() eine Zeichenfolge in die passende Enum-Konstante umwandelt. Die Methode ordinal() gibt die Position der Konstante zurück (beginnend bei 0):
for (Day d : Day.values()) {
System.out.println(d + " is at position " + d.ordinal());
}
Day day = Day.valueOf("FRIDAY"); // Konvertiert String zu EnumEnums sind ideal, wenn du eine bekannte, festgelegte Menge von Werten hast, die sich zur Laufzeit nicht ändert, und machen deinen Code sicherer und ausdrucksstärker als die Verwendung einfacher Konstanten.
Aufgabe
EinfachErstellen wir ein Bestellsystem für ein Café, das die Leistungsfähigkeit von Enums mit Feldern, Konstruktoren und Methoden demonstriert. Du erstellst ein CoffeeSize-Enum, das Preisinformationen speichert, sowie ein System zur Verarbeitung von Kundenbestellungen.
Du organisierst deinen Code auf drei Dateien:
CoffeeSize.java: Erstelle ein Enum, das Kaffeegrößen mit den zugehörigen Preisen repräsentiert. Dein Enum sollte drei Konstanten enthalten:SMALL,MEDIUMundLARGEmit den Preisen2.50,3.50beziehungsweise4.50.Jede Größe benötigt ein privates
price-Feld (double), einen Konstruktor, der dieses setzt, und einegetPrice()-Methode, um den Wert abzurufen. Füge außerdem einegetDescription()-Methode hinzu, die einen String im Format[size name] - $[price]zurückgibt (zum Beispiel:SMALL - $2.5)Order.java: Erstelle eine Klasse, die eine Kaffeebestellung repräsentiert. Ein Order-Objekt verfügt über zwei private Felder:customerName(String) undsize(CoffeeSize). Füge einen Konstruktor hinzu, der beide Felder initialisiert, sowie Getter-Methoden für jedes Feld.Füge eine
getReceipt()-Methode hinzu, die einen mehrzeiligen String zurückgibt:Order for: [customerName] Size: [size description from getDescription()] Total: $[price from the size]Main.java: Erwecke dein Café zum Leben! Du erhältst zwei Eingaben: einen Kundennamen (String) und einen Größennamen (String wie "SMALL", "MEDIUM" oder "LARGE").Verwende zuerst
CoffeeSize.valueOf(), um den Größen-String in die entsprechende Enum-Konstante umzuwandeln. Erstelle eine Order mit dem Kundennamen und der Größe und gib anschließend den Beleg aus.Gib nach dem Beleg eine leere Zeile aus und zeige dann das vollständige Menü an, indem du mithilfe der
CoffeeSize-Methode über allevalues()-Werte iterierst. Gib für jede Größe ihre Beschreibung in einer eigenen Zeile aus.
Du erhältst zwei Eingaben in dieser Reihenfolge: den Kundennamen und den Größennamen (einen von "SMALL", "MEDIUM" oder "LARGE").
Beachte, wie das Enum sowohl die Identität der Größe als auch den zugehörigen Preis kapselt – deutlich übersichtlicher, als separate Konstanten oder magische Zahlen im gesamten Code zu verwenden!
Probier es selbst
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Eingaben lesen
String customerName = scanner.nextLine();
String sizeName = scanner.nextLine();
// TODO: Konvertiere sizeName mit valueOf() in das CoffeeSize-Enum
// TODO: Erstelle eine Order mit dem Kundennamen und der Größe
// TODO: Drucke die Quittung
// TODO: Drucke eine leere Zeile
// TODO: Zeige das vollständige Menü an, indem du alle CoffeeSize-Werte durchiterierst
// Hint: Verwende CoffeeSize.values(), um alle Enum-Konstanten zu erhalten
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDas Schlüsselwort thisMethodenFelder (Attribute)KonstruktormethodeÜberladen von KonstruktorenRückblick – Einfacher Taschenrechner4Vererbung
Grundlegende Vererbung (extends)Das Schlüsselwort superÜberschreiben von Methoden (@Override)KonstruktorverkettungDie Object-KlasseEinfach- und mehrstufige VererbungWarum keine Mehrfachvererbung von KlassenRückblick – Mitarbeiterhierarchie7Spezielle Methoden & Object-Klasse
toString()-Methodeequals() und hashCode()clone()-MethodecompareTo() und ComparableComparator-SchnittstelleRückblick – Benutzerdefinierte Sortierung2Zugriffsmodifikatoren & Kapselung
Übersicht der ZugriffsebenenGetter- und Setter-MethodenInformationsverbergungDas Schlüsselwort finalRückblick – Bankkontoverwaltung5Polymorphismus
Grundlagen der MethodenüberladungMethodenüberschreibung (Laufzeit)Upcasting und DowncastingDer instanceof-OperatorAbstrakte Klassen und MethodenRückblick – Formrechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungAggregation vs. KompositionInnere, verschachtelte & anonyme KlassenEnums und Enum-MethodenRecords (Java 16+)Versiegelte Klassen (Java 17+)11Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterBuilder-MusterObserver-MusterStrategie-Muster14Abschließende Herausforderungen
E-Learning-PlattformBankingsystemEntwicklung einer SpielfigurFahrzeugvermietungsdienst3Klassen-Props & statische Member
Instanz- vs. statische VariablenStatische MethodenStatische BlöckeKonstanten (static final)Wiederholung – Counter & Utility6Schnittstellen & abstrakte Klassen
Einführung in InterfacesInterfaces implementierenMehrere Interfaces implementierenDefault & Static in InterfacesAbstrakte Klassen vs. InterfacesFunktionale InterfacesRückblick – ZahlungssystemÜbe selbstständig: Online-Java-Compiler