Я просто ответил на этот вопрос, сказав, как решить проблему компиляции:
Как использовать поля в перечислении java, переопределяя метод?
Но я не понимаю, почему ошибка происходит в первую очередь.
Вот пример, написанный как перечисление:
public enum MyEnum {
FIRST {
@Override
public String doIt() {
return "1: " + someField; //error
}
},
SECOND {
@Override
public String doIt() {
return "2: " + super.someField; //no error
}
};
private String someField;
public abstract String doIt();
}
Вот то же самое, что и абстрактные классы
abstract class MyClass {
class FIRST extends MyClass {
@Override
public String doIt() {
return "1: " + someField; //no error
}
};
class SECOND extends MyClass {
@Override
public String doIt() {
return "2: " + super.someField; //no error
}
};
private String someField;
public abstract String doIt();
}
В случае FIRST
в реализации enum
он не может получить доступ к someField
. Однако в случае абстрактного класса он может.
Кроме того, добавление super
устраняет проблему, как и удаление модификатора private
в поле.
Кто-нибудь знает, почему эта небольшая причуда в поведении происходит?