Почему реализации перечисления не имеют доступа к закрытым полям в классе перечисления

Я просто ответил на этот вопрос, сказав, как решить проблему компиляции:

Как использовать поля в перечислении 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 модификатор на поле.

Кто-нибудь знает, почему происходит эта небольшая причуда в поведении?

Ответы на вопрос(4)

Ваш ответ на вопрос