public enum MyEnum1 {
FOO(BAR), BAR(FOO);
private MyEnum1 other;
private MyEnum1(MyEnum1 other) {
this.other = other;
}
public MyEnum1 getOther() {
return other;
}
}
MyEnum1
generuje błąd Cannot reference a field before it is defined
, co jest dość zrozumiałe, gdyż sprawach porządkowych deklaracja tutaj. Ale dlaczego poniższe kompilacje?Wydaje się, że mogę odwołać * pola zanim zostanie zdefiniowany *
public enum MyEnum2 {
FOO { public MyEnum2 getOther() { return BAR; } },
BAR { public MyEnum2 getOther() { return FOO; } };
public abstract MyEnum2 getOther();
}
FOO
dotyczy BAR
przed BAR
jest zdefiniowana, nie mam racji?
Czy nie są stałe "enum" skompilowane do struktur podobnych do klas? Zwracając 'BAR', faktycznie odnosisz się do typu. Przeczytaj [tutaj] (http://stackoverflow.com/questions/7276775/what-does-java-compile-an-enumeration-down-to): _set prawidłowych wartości jest tworzony przy czasie inicjowania typu_ –
[JLS] (http : //docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.9.1) mówi _Opcjonalny korpus klasy stałej wyliczeniowej domyślnie definiuje anonimową deklarację klasy (§15.9. 5), który rozszerza natychmiast zamykający typ wyliczeniowy. –