Почему реализации перечисления не имеют доступа к закрытым полям в классе перечисления
Я просто ответил на этот вопрос, сказав, как решить проблему компиляции:
Как использовать поля в перечислении java, переопределяя метод?
Но что я не понимаю, так это то, почему ошибка происходит в первую очередь.
Вот пример, написанный как enum:
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
модификатор на поле.
Кто-нибудь знает, почему происходит эта небольшая причуда в поведении?