home  |  suche  |  kontakt/johner  |  institut 
studierende  |  tech-docs  |  mindmailer 

Bisher

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).

Enum

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 mit Konstrukturen und Methoden

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());
    }
  }
}

Ausgabe

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