Enum, Switch und Instanceof

1. Enumerationen

Mit dem Schlüsselwort enum wird eine spezielle Art Klasse deklariert, die Element-Aufzählungen (Enumerationen) beinhaltet.

Basis-Syntax:

public enum Wochentag {
    MONTAG, DIENSTAG, MITTWOCH, DONNERSTAG, FREITAG, SAMSTAG, SONNTAG
}

Diese Enumeration kann entweder als eigene Klasse implementiert werden oder als "innere" Klasse innerhalb einer anderen.

Angesprochen werden können einzelne Werte als z.B. Wochentag.FREITAG

Enums implementieren das Interface Comparable<T> und haben daher die Methode compareTo(..). Sortiert wird in der Reihenfolge der Definition (hier also nach der Reihenfolge der Wochentage).

Normale Zuweisung: Wochentag wochenBeginn = Wochentag.MONTAG;

Falls der Wert textuell vorliegt: Wochentag wochenendBeginn = Wochentag.valueOf("SAMSTAG");

Vergleiche: if (wochenBeginn == Wochentag.MONTAG) { …​ }

Enums eignen sich auch sehr gut als "Material" für Switch-Statements.

Iterieren über Enums am besten mit klassischem for oder for-each:

public void demoEnumWochentagSchleife() {
    for (int i = 0; i < Wochentag.values().length; i++) {
        System.out.format("Tag %d: %10s (%<2.2s)%n", // mit 2-Zeichen-Kurzform
                i, Wochentag.values()[i]);
    }
    // oder mit for-each:
    for (Wochentag w : Wochentag.values()) {
        System.out.format(" %2.2s", w);
    }
    System.out.println();
}

Die Java-Umsetzung von enum hat jedoch wesentlich weiterreichende Möglichkeiten.

1.1. Erweiterte Möglichkeiten von Enums

Hier ein Beispiel für Gender (hier mit 4 Geschlechtern), wobei auch ein Ein-Zeichen-Kürzel für jedes Geschlecht festgelegt wird. Aus diesen Kürzeln kann mit der Methode gender4Code(char code) (und der Convenience-Methode gender4code(String codeTxt)) das passende Enum-Element bereitgestellt werden:

    public enum Gender {
        FEMALE('f'), MALE('m'), OTHER('o'), UNKNOWN('-');
        private char code;

        Gender(char code) {
            this.code = code;
        }

        public char code() {
            return this.code;
        }

        public static Gender gender4code(char code) {
            for (Gender gndr : Gender.values()) {
                if (gndr.code() == code) {
                    return gndr;
                }
            }
            return null;
        }

        public static Gender gender4code(String codeTxt) {
            if (codeTxt == null || codeTxt.length() != 1) {
                return null;
            }
            return gender4code(codeTxt.charAt(0));
        }

        public static String joinAllCodes() {
            String padding = "";
            String txt = "'";
            for (Gender gndr : Gender.values()) {
                txt += padding + gndr.code;
                padding = "', '";
            }
            return txt + "'";
        }
    }

Nun eine "normale" Java-Klasse, die im Prinzip (allerdings syntaktisch deitlich umständlicher) das selbe kann:

    public static class Gender2 {
        public static final Gender2 FEMALE = new Gender2('f');
        public static final Gender2 MALE = new Gender2('m');
        public static final Gender2 OTHER = new Gender2('o');
        public static final Gender2 UNKNOWN = new Gender2('-');
        private char code;

        public static Gender2[] values() {
            return new Gender2[] {FEMALE, MALE, OTHER, UNKNOWN};
        }

        public Gender2(char code) {
            this.code = code;
        }

        public char code() {
            return this.code;
        }

        public static Gender2 gender4code(char code) {
            for (Gender2 gndr : Gender2.values()) {
                if (gndr.code() == code) {
                    return gndr;
                }
            }
            return null;
        }

        public static Gender2 gender4code(String codeTxt) {
            if (codeTxt == null || codeTxt.length() != 1) {
                return null;
            }
            return gender4code(codeTxt.charAt(0));
        }

        public static String joinAllCodes() {
            String padding = "";
            String txt = "'";
            for (Gender2 gndr : Gender2.values()) {
                txt += padding + gndr.code;
                padding = "', '";
            }
            return txt + "'";
        }
    }

Man sieht also, dass die enum-Werte KONSTANTE Objekte der enum-Klasse sind!

Weiteres dazu siehe

2. Switch-Statement

Auch Enums eignen sich sehr gut als "Material" für Switch-Statements

3. Operator 'instanceof'