Vor Java5 gab es keinen Aufzählungstypen. Dieses Manko glich man meist durch "final static" Konstanten aus:
01 package org.johner.java5;
02
03
04 public class PreEnums {
05 private final static int BIT = 1;
06 private final static int WI = 2;
07 private final static int TI = 3;
08
09 public static void main (String[] args) {
10 new PreEnums().instantiate();
11 }
12
13 private void instantiate() {
14 FhStudent student0 = new FhStudent(BIT);
15 FhStudent student1 = new FhStudent(1);
16 FhStudent student2 = new FhStudent(10);
17 }
18
19 /**
20 * inner class!
21 */
22 public class FhStudent {
23 int course;
24 public FhStudent (int kurs) {
25 course = kurs;
26 }
27 }
28 }
|
Das obige Beispiel zeigt jedoch gleich ein Schwäche der Lösung: Ein FH-Student kann auch mit einem ungültigen int-Wert instanziert werden (Zeile 16).
Mit Java 5 wird ein neues Schlüsselwort "enum" eingeführt, mit dem sich Aufzählungen deklarieren lassen. Mit diesem Aufzählungtyp erreicht man:
- Sicherheit bezüglich von Übergabeparametern: der Compiler erlaubt nur gültige Werte (In Zeile 11 des folgenden Beispiels)
- Einfach Switch-Statements (Zeile 24ff.)
- Nur gültige Werte in Switch-Statements möglich (Zeile 29)
- Lesbare Debug-Ausgaben (Zeile 35 f.), die keine int-Werte, sondern die definierten Werte (hier: BIT, WI, TI) enthalten
01 package org.johner.java5;
02
03 public class Enums {
04 public enum StudyCourses {BIT, WI, TI};
05
06 public static void main (String[] args) {
07 new Enums().instantiate();
08 }
09
10 private void instantiate() {
11 FhStudent student3 = new FhStudent(StudyCourses.WI);
12 student3.testSwitch();
13 student3.dumpCourses();
14 }
15
16 public class FhStudent {
17 //new
18 StudyCourses theCourse;
19 public FhStudent (StudyCourses kurs) {
20 theCourse = kurs;
21 System.out.println("Der kurs ist " + theCourse);
22 }
23
24 public void testSwitch() {
25 switch(theCourse) {
26 case BIT: System.out.println("Ist ein Bittler"); break;
27 case TI: System.out.println("Ist ein TI-ler"); break;
28 case WI: System.out.println("Ist ein WI-ler"); break;
29 //case RO: System.out.println("Ist ein TI-ler"); break;
30 }
31 }
32
33 public void dumpCourses () {
34 for (StudyCourses aCourse : StudyCourses.values()){
35 System.out.println("We have a " +
36 "study course " + aCourse);
37 }
38 }
39 }
40 }
|
Enums können selbst Konstruktoren und Methoden enthalten. Z.B.
package enumi;
public enum Monat {
Januar(31) {
String drucken(){
return "Ich bin der Super-Januar";
}
},
Feburar(28){
String drucken(){
return "Ich bin der Super-Februar";
}
},
Maerz(31){
String drucken(){
return "Ich bin der Super-März";
}
};
private final int tage;
private Monat(int tage){
this.tage = tage;
}
public int getTage(){
return tage;
}
abstract String drucken();
}
|
Diese Enum können Sie wie folgt nutzen:
package enumi;
public class StartEnumis {
public static void main(String[] args) {
System.out.println("Der März hat "+ Monat.Maerz.getTage() + " Tage");
System.out.println(">" + Monat.Maerz.drucken());
for (Monat monat: Monat.values()){
System.out.print("Schleife: " + monat.drucken());
System.out.println("\t " + monat.getTage());
}
}
}
|
Der März hat 31 Tage
>Ich bin der Super-März
Schleife: Ich bin der Super-Januar 31
Schleife: Ich bin der Super-Februar 28
Schleife: Ich bin der Super-März 31