Was sind Enumerationen in Java? Was ist der Unterschied zu einer Klasse?

Enumerationen sind spezielle Klassen. Sie dienen zum Speichern von konstanten Objekten. Die konstanten Objekte sind von java.lang.Enum abgeleitet und besitzen unter anderem folgende Methoden:

  • public final int ordinal() – gibt die Ordinalzahl (eine laufende Nummer, beginnend bei 0) des Enum-Objekts zurück
  • public final String name() – gibt den Namen des Enum-Objekts zurück
  • public final String toString() – gibt – genauso wie die Methode name() – den Namen des Enum-Objekts zurück
  • public final int compareTo(E other) – vergleicht das Enum-Objekt mit einem anderen Enum-Objekt vom Typ E anhand der Ordinalzahl.

Zusätzlich werden vom Compiler für eine Enumeration vom Typ E folgende Methoden generiert:

  • public static final E[] values() – gibt ein Array mit allen Enum-Objekten zurück
  • public static E valueOf(String s) – gibt das Enum-Objekt mit dem Namen s zurück

In einer Enumeration können eigene Instanzvariablen und Methoden definiert werden.

Eine Enumeration ist ein Aufzählungstyp. Das heißt, ihre Elemente sind geordnet, können also mit der Methode compareTo() verglichen werden. Das Vergleichskriterium ist die Ordinalzahl des Enum-Objekts. Die Ordinalzahl eines Enum-Objekts entspricht – wenn nicht anders definiert – der Position, an der der Name des Objekts in der enum angeführt ist. Im untenstehenden Beispiel hat ROT die Ordinalzahl 0, GRÜN die Ordinalzahl 1 und BLAU die Ordinalzahl 2.

Einfaches Beispiel für eine Enumeration:

enum Farbe {
    ROT, GRÜN, BLAU
}

// Verwendung:
        
Farbe f = Farbe.GRÜN;
System.out.println(f.ordinal());  // Ausgabe: 1
System.out.println(f.name());     // Ausgabe: GRÜN

Komplexeres Beispiel mit einer Enumeration:

public class EnumTest {
    enum Wochentag {
        MONTAG("Mo"), DIENSTAG("Di"), MITTWOCH("Mi"), DONNERSTAG("Do"), FREITAG("Fr"), SAMSTAG("Sa"), SONNTAG("So");

        private final String shortName;

        Wochentag(String shortName) {
            this.shortName = shortName;
        }
        
        String getShortName() {
            return shortName;
        }

        boolean isWerktag() {
            return Wochentag.SONNTAG.compareTo(this) != 0;
        }
    }

    public static void main(String[] args) {
        System.out.println(Wochentag.MITTWOCH.isWerktag());
        System.out.println(Wochentag.SONNTAG.isWerktag());
        for (Wochentag w : Wochentag.values()) {
            System.out.printf("%d %-5b %-10s %s\n", w.ordinal(), w.isWerktag(), w.name(), w.getShortName());
        }
    }
}

// Ausgabe:
//
// 0 true  MONTAG     Mo
// 1 true  DIENSTAG   Di
// 2 true  MITTWOCH   Mi
// 3 true  DONNERSTAG Do
// 4 true  FREITAG    Fr
// 5 true  SAMSTAG    Sa
// 6 false SONNTAG    So

Die Enum-Objekte von Wochentag haben ein zusätzliches Attribut shortName, das die Kurzbezeichnung des Wochentags speichert. Beim Initialisieren der Enumeration wird für jedes Objekt der Aufzählung der Konstruktor in Zeile 7 mit dem Kurznamen als Argument aufgerufen.

Die Methode isWerktag() vergleicht das Objekt, in dem diese Methode aufgerufen wird, mit dem Objekt SONNTAG. Liefert der Vergleich einen Wert ungleich 0, handelt es sich um einen Werktag. Ansonsten handelt es sich um einen Sonntag.