Definition
Enumerations
Eine Enumeration (kurz enum) ist in Java ein spezieller Datentyp, mit dem man eine feste, endliche Menge von benannten Konstanten definieren kann.
Ein Enum wird verwendet, wenn eine Variable nur bestimmte, klar abgegrenzte Werte annehmen darf – zum Beispiel die Wochentage, Himmelsrichtungen oder Gegenstandsarten in einem Spiel.
Beispiel 1
public enum Wochentag
{
MONTAG, DIENSTAG, MITTWOCH, DONNERSTAG, FREITAG, SAMSTAG, SONNTAG
}
Beispiel 2
public class Algersauswertung
{
public enum Altersgruppe
{
BABY, JUGENDLICHER, KIND, KLEINKIND, ERWACHSENER, RENTNER, ERROR
}
private Altersgruppe bestimmeAltersgruppe(int alter)
{
if (alter < 0) return Altersgruppe.ERROR; else
if (alter < 2) return Altersgruppe.BABY; else
if (alter < 6) return Altersgruppe.KLEINKIND; else
if (alter < 14) return Altersgruppe.KIND; else
if (alter < 18) return Altersgruppe.JUGENDLICHER; else
if (alter < 67) return Altersgruppe.ERWACHSENER; else
return Altersgruppe.RENTNER;
}
public void kleinerTest(int alter)
{
Altersgruppe gruppe = bestimmeAltersgruppe(alter);
System.out.println("Mit " + alter + " Jahren: " + gruppe);
}
}
Dieses Programm zeigt, wie man in Java eine Aufzählung (englisch enum) benutzt. Eine Aufzählung ist ein eigener Datentyp mit einer festen Anzahl möglicher Werte. Da es sich bei diesen Werten um nicht veränderbare Konstanten handelt, werden die Werte in Großbuchstaben geschrieben, wie alle Java-Konstanten.
In unserem Beispiel gibt es die Altersgruppen BABY, KLEINKIND, KIND, JUGENDLICHER, ERWACHSENER und RENTNER, außerdem die "Altersgruppe" ERROR, falls jemand mal ein Alter kleiner als 0 Jahre eingegeben hat.
Deklaration der Aufzählung:
public enum Altersgruppe
{
BABY, JUGENDLICHER, KIND, KLEINKIND, ERWACHSENER, RENTNER, ERROR
}
In dieser Deklaration wird festgelgt, welche Werte eine Variable vom Typ Altersgruppe haben darf.
Die Methode bestimmeAltersgruppe() fragt in einer geschachtelten if-else-Anweisung das als Parameter übergebene Alter ab und gibt dann die entsprechende Konstante der Aufzählung Altersgruppe zurück.
In der Methode kleinerTest() wird zunächst die Altersgruppe bestimmt und in der lokalen Variable gruppe gespeichert, die dann mit dem System.out.println()-Befehl ausgegeben wird.
Aufzählungen als eigene Klasse
Man kann eine Enumeration formal wie eine Java-Klasse behandeln, wie das folgende Beispiel zeigt:
public enum Altersgruppe
{
KLEINKIND,
KIND,
JUGENDLICHER,
ERWACHSENER,
RENTNER
}
Hier sehen wir eine etwas vereinfachte Form der Aufzählung.
public class Altersdemo
{
public Altersgruppe bestimmeGruppe(int alter)
{
if (alter < 6) return Altersgruppe.KLEINKIND;
if (alter < 14) return Altersgruppe.KIND;
if (alter < 18) return Altersgruppe.JUGENDLICHER;
if (alter < 67) return Altersgruppe.ERWACHSENER;
return Altersgruppe.RENTNER;
}
public void zeigeGruppe(int alter)
{
Altersgruppe gruppe = bestimmeGruppe(alter);
System.out.println("Mit " + alter + " Jahren: " + gruppe);
}
}
Und hier sehen wir eine Java-Klasse Altersdemo, welche die Enumeration der Klasse Altersgruppe einbindet und auswertet.
Aufzählungen im Adventure-Game
In der Folge 4 des OOP-Kurses wird ein kleines Adventure-Game besprochen. Eine der ersten Übungen dazu lautet, die Klasse Gegenstand mit einem Typ zu versehen, zum Beispiel Waffe, Rüstung, Trank oder Sonstiges.
Dies kann man leicht mithilfe einer Enumeration machen, wie das folgende Beispiel zeigt.
public enum GegenstandsTyp
{
WAFFE,
SCHILD,
RUESTUNG,
TRANK,
SCHMUCK,
SONSTIGES
}
Der Gegenstandstyp wurde hier als eigene Klasse definiert. Daher stehen diese Konstanten nicht nur der Klasse Gegenstand zur Verfügung, sondern auch allen anderen Klassen des Projekts.
Die Verwendung dieser Klasse in der Klasse Gegenstand sieht dann so aus:
public class Gegenstand
{
private String name;
private int angriffswert, verteidigungswert, goldwert, zustand;
private GegenstandsTyp typ;
public Gegenstand(String n, int a, int v, int g, int t, GegenstandsTyp typ)
{
name = n;
angriffswert = (a < 0) ? 0 : a;
verteidigungswert = (v < 0) ? 0 : v;
goldwert = (g < 0) ? 0 : g;
zustand = 100;
if (typ == null)
this.typ = GegenstandsTyp.SONSTIGES;
else
this.typ = typ;
}
// Weitere Methoden: Getter, Anzeigen etc.
Der übergebene Parameter typ ist jetzt ein Objekt der Klasse GegenstandsTyp. Falls ein nicht definierter Typ übergeben wird (typ == null), wird der Typ automatisch auf SONSTIGES gesetzt.
Die einzelnen Typen sind Konstanten, daher ist es üblich, alle Buchstaben des Typs groß zu schreiben.
In der Klasse Inventar wird dieser Aufzählungstyp dann ebenfalls benutzt, weil der Konstruktor von Gegenstand einen Parameter dieses Typs verlangt:
g[ 0] = new Gegenstand("Hammer",20,3,567, 100, GegenstandsTyp.WAFFE);
g[ 1] = new Gegenstand("Helm",0,13,230, 100, GegenstandsTyp.RUESTUNG);
g[ 2] = new Gegenstand("Stiefel",4,10,177,100, GegenstandsTyp.RUESTUNG);
Zurück zur Übung 4.2.3 #1 auf der Seite 4.2
Quellen:
- Lahres et al.: Objektorientierte Programmierung, Rheinwerk Computing 2021.
- Barnes, Kölling: Java lernen mit BlueJ - Objects first. Pearson-Verlag 2019.
- Ullenboom: Java ist auch eine Insel, Rheinwerk Computing 2023.