Синтаксический сахар, предоставляемый средством Java enum
, иногда может быть немного запутанным. Рассмотрим этот пример, который не компилируется:
public enum TestEnum {
FOO("foo") {
public void foo() {
helper(); // <- compiler error
}
};
String name;
TestEnum(String name) {
this.name = name;
}
public abstract void foo();
private void helper(){
// do stuff (using this.name, so must not be static)
}
}
Может кто-нибудь объяснить, почему компилятор говорит
Нестатический метод 'helper()' не может ссылаться на статический контекст
Как именно этот контекст статичен?
Вы можете сделать эту компиляцию, изменив вызов на this.
helper()
(здесь есть одна запутанная точка: если мы действительно находимся в "статическом контексте", как предлагает компилятор, как можно "this
" работать?) или путем увеличения видимости helper()
до уровня по умолчанию. Что бы вы предпочли? Кроме того, не стесняйтесь предлагать лучшее название вопроса: -)
Изменить. Я нашел некоторое обсуждение об этом - но реальных ответов нет. Мой коллега считает, что этот this.helper()
работает на самом деле ошибка компилятора. И действительно, с более новыми версиями Java, похоже, не работает (хотя super.helper()
делает): "не удается найти символ helper()". (Хотя там что-то странное происходит: после попытки с разными версиями Java я не могу получить this.helper()
для компиляции с любым из них...)