Seit Java 1.5 gibt es die sogenannten Enumerations, kurz Enums. Auf deutsch würde der Datentyp wohl „Aufzählung“ heißen. Und genau das ist es auch, eine Aufzählung von Werten, als eigener Datentyp bietet Java hier einige Vorteile. Aber erstmal zur Deklarierung einer solchen Enum:
public enum FruchtkorbEnum { APFEL, BANANE, ERDBEERE, MELONE, PFIRSICH } |
Wie man sehen kann kein großer Akt. Man könnte jetzt meinen, dass man Enums mit dem bekannten equals() vergleichen muss. Dies ist ja zum Beispiel für Strings und andere Objekte pflicht. Also etwa so:
public class FruchtKorbTest { public static void main(String[] args) { FruchtkorbEnum meinEinkauf = getEinkauf(); if (meinEinkauf.equals(FruchtkorbEnum.APFEL)) { System.out.println("Ein Apfel wurde gekauft..."); } else if (meinEinkauf.equals(FruchtkorbEnum.BANANE)) { System.out.println("..."); } } private static FruchtkorbEnum getEinkauf() { // Mache etwas kluges ;) return null; } } |
Wer aufgepasst hat wird merken, dass obiger Code natürlich eine Nullpointer-Exception werfen wird. Um dies zu verhindern kann man einerseits die Konstante nach vorne stellen oder aber „==“ verwenden, denn der Enum-Typ gilt in Java als primitiver Datentyp. Das heißt ein Vergleich via „==“ ist zulässig und auch ein guter Stil. Denn damit bekommt man zwei Vorteile auf einen Schlag:
- Geschwindigkeit: „==“ ist schneller als equals()
- Null-Safe: Es können keine Nullpointer-Exceptions mehr auftreten
Der Code sähe dann so aus:
public class FruchtKorbTest { public static void main(String[] args) { FruchtkorbEnum meinEinkauf = getEinkauf(); if (meinEinkauf == FruchtkorbEnum.APFEL) { System.out.println("Ein Apfel wurde gekauft..."); } else if (meinEinkauf == FruchtkorbEnum.BANANE) { System.out.println("..."); } else if (FruchtkorbEnum.PFIRSICH.equals(meinEinkauf)) { // Beispiel mit Konstante vorne... System.out.println("..."); } } private static FruchtkorbEnum getEinkauf() { // Mache etwas kluges ;) return null; } } |
Hinweis: Wer die Konstante, also zum Beispiel FruchtkorbEnum.APFEL nach vorne stellt und dann equals() aufruft (letztes if im obigen Code), macht nichts falsch, verschenkt jedoch den Geschwindigkeitsvorteil, auch wenn equals() an der Enum-Klasse überschrieben wurde und selber ein Vergleich via „==“ ausführt, es kostet immerhin einen Methodenaufruf mehr ;).
den if else construct kann man auch mit einem switch / case mit enums gut lösen:
switch(meinEinkauf){
case FruchtkorbEnum.APFEL:
System.out.println(„Ein Apfel wurde gekauft…“);
break;
case FruchtkorbEnum.BANANE:
System.out.println(„…“);
break;
case FruchtkorbEnum.PFIRSICH:
System.out.println(„…“);
break;
}