Синтаксический сахар, предоставляемый 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()
скомпилировать снова с любой из них ...)