Illegal reference to static field from initializer

Ich habe hier ein Stückchen Code, das hat scheinbar das ganze letzte Jahr lang funktioniert (Java 1.5), nun aber gibt’s mit dem neuen Java 1.6 beim Kompilieren oben genannten Fehler. Nun bin ich verwirrt und mir fällt nichts ein, wie ich das umgehen kann. Kann mir jemand einen Tipp geben?

Danke!
Schnoof

public enum ABC {

 A ("A"),
 B ("B"),
 C ("C");

 public final int letterIndex;
 public static int lettersCounter = 0;

 private ABC(final String letter) {
 this.letterIndex = ++ ABC.lettersCounter;
 }

}
public enum ABC {

 A ,
 B ,
 C ;
}


> 

Das was du da von Hand versuchst zu bauen erledigen die Methoden
ordinal und toString für dich.

Jens

public enum ABC {

A ,
B ,
C ;
}

Das was du da von Hand versuchst zu bauen erledigen die
Methoden
ordinal und toString für dich.

  1. ordinal() fängt bei 0 an zu zählen.
  2. nur weil in dem Beispiel Name und Wert identisch waren, muss das in Wirklichkeit nicht auch so sein. Wie wäre es mit
    A („a“), B („be“), C („ce“);
    ?

Bis denne
Schnoof

Hi Schnoof,
ich weiß zwar immer noch nicht was du eigentlich erreichen willst, aber seis drum.

Ich hab dein Code Schnippsel in Eclipse geworfen

Compiler Compliance level: 6.0
JRE: jdk1.6.0_02

Funktioniert problemlos.

wenn ich in ++ABC.lettersCounter das ABC weglasse funktioniert es interessanter weise nicht mehr.

in jdk1.6.0_02 funktioniert es gar nicht.

Letzteres entspricht auch der aktuellen Spezifikation:


It is a compile-time error to reference a static field of an enum type that is not a compile-time constant (§15.28) from constructors, instance initializer blocks, or instance variable initializer expressions of that type. It is a compile-time error for the constructors, instance initializer blocks, or instance variable initializer expressions of an enum constant e to refer to itself or to an enum constant of the same type that is declared to the right of e.


aus: http://java.sun.com/docs/books/jls/third_edition/htm…

Dies ist notwendig, da für die Enumkonstanten ja static fields erzeugt werden. Und nicht klar ist, wer da wann in welcher Reihenfolge Instanziert werden soll.

Daher würde ich das bis auf weiteres als Fehler vom Eclipse Compiler und vom JDK1.5 einstufen

Eine korrekte Lösung (bis auf den konstanten Summanden 1) des Problems wurde ja schon geliefert.

Jens