Ошибка "non-static variable cannot be referenced from a static context" в переопределённом методе перечисления
Есть enum, в котором две константы, три переменные и один метод, из которого есть доступ к private переменной. Для второй константы переопределяю метод, из которого доступа к private переменной уже нет. Вылезает ошибка:
non-static variable b cannot be referenced from a static context
Но к public переменной доступ есть. Не понимаю, почему?
enum MyEnum {
CONST_1,
CONST_2 {
@Override
public void print() {
System.out.println(b); // ошибка
System.out.println(c); // нормально
}
};
private int a;
private int b;
public int c;
public void print() {
System.out.println(a);
}
}
Ответы (1 шт):
Константы в перечислениях являются по умолчанию public static final
.
При переопределении некой константы в перечислении с переопределённым методом будет создан эквивалент вложенного статического класса -- анонимный вложенный класс, унаследованный от данного перечисления MyEnum
:
class MyEnum extends Enum<MyEnum> {
public static final MyEnum CONST_1 = ...; // инициализация вида new MyEnum("CONST_1", 0)
public static final class MyEnum$1 extends MyEnum {
@Override
public void print() {
System.out.println(b); // ошибка
System.out.println(c); // нормально
}
}
public static final MyEnum CONST_2 = ...; // new MyEnum$1("CONST_2", 1);
private int a; // не используется в статическом классе-потомке
private int b;
}
Соответственно, доступ к приватным членам внешнего класса запрещён для вложенных статических классов, каковым является переопределённый элемент перечисления.
Чтобы получить доступ к переменной b
, следует либо просто сделать её доступнее, убрав модификатор private
или же заменив его на public
/ protected
, либо сослаться на класс-предок при помощи super
:
// ...
CONST_2 {
@Override
public void print() {
System.out.println("b=" + super.b); // ОК!
System.out.println("c=" + c); // нормально
}
};
Подобные вопросы на основном SO: