Ответ 1
Это ошибка времени компиляции для конструкторов, блоков инициализатора экземпляра или выражений инициализатора экземпляра константы перечисления
e
для ссылки наe
или на константу перечисления того же типа, которая объявлена в справа отe
.
Спецификация здесь означает, что вы не можете ссылаться по имени, потому что поле, на которое указывает e
, еще не инициализировано. Это не значит, что вы не можете получить доступ к this
.
Это в основном то же самое правило, что и любой другой инициализатор (например, int x = x;
).
Мы можем понять, почему с примером вроде (Ideone):
enum Example {
INSTANCE {{
subversion();
}};
static void subversion() {
System.out.println(INSTANCE);
}
public static void main(String[] args) {
System.out.println(INSTANCE);
}
}
Какие выходы
null
INSTANCE
Я обнаружил, что если
mMap
является закрытым, на него нельзя ссылаться в инициализаторе экземпляра.
Вы можете квалифицировать вызов как super.mMap.put(...);
. Частный mMap
не унаследован, но доступен из внутреннего класса. Я также рассказал об этом здесь. Короче говоря, простое имя mMap
относится к несуществующему внешнему экземпляру Derp
.
Мы можем проверить, что это имеет место с примером вроде (Ideone):
class Example {
private int x;
class Inner extends Example {{
x = 1; // refers to the outer instance
super.x = 2; // refers to the inner instance
}}
public static void main(String[] args) {
Example outer = new Example();
Example inner = outer.new Inner();
System.out.println(outer.x); // prints 1
System.out.println(inner.x); // prints 2
}
}
За исключением вашего случая FOO
является статическим, поэтому внешний экземпляр &mdash отсутствует, поэтому ошибка компилятора.