Синтаксический сахар, предоставляемый средством 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)
}
}
Может кто-нибудь объяснить, почему компилятор говорит
Non-статический метод «помощник()» не может ссылаться из статического контекста
Как именно этот контекст статичен?
Вы можете сделать это компиляции путем изменения вызова this.
helper()
(здесь один запутанным пункт: если мы на самом деле в «статическом контексте», как предполагает компилятор, как может «this
» работать) или по увеличивая видимость helper()
до уровня по умолчанию. Что бы вы предпочли? Кроме того, не стесняйтесь предлагать лучшее название вопроса :-)
Редактировать: Я нашел some discussion about this - но реальных ответов нет. Мой коллега считает, что работа this.helper()
на самом деле является ошибкой компилятора. И действительно, с более новыми версиями Java кажется не работать (хотя super.helper()
делает): «не удается найти символ хелпер()». (Хотя есть что-то странное: после попытки с использованием разных версий Java я не могу получить this.helper()
, чтобы скомпилировать с любым из них ...)
У меня есть книга; о чем вы говорите? (Я не мог найти его быстро.) – Jonik
Обе мои копии книги упакованы в ящики где-то, поэтому я понятия не имею. –