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
Siehe switch-klassich und neu: switch-Ausdruck
Auch Enums eignen sich sehr gut als "Material" für Switch-Statements
3. Operator 'instanceof'
Siehe instanceof-Operator