Сообщение об ошибке сбивает с толку.
Проблема в том, что когда вы даете код значения перечисления, вы создаете анонимный подкласс перечисления. (Его класс будет EnumWithAbstractMethodAndMembers$1
). Подкласс не может получить доступ к закрытым членам своего суперкласса, однако вложенные классы могут через сгенерированный метод доступа. Вы должны иметь доступ к закрытому полю, и сообщение об ошибке, которое оно выдает, кажется неверным.
Кстати, вы можете использовать это, но вам не нужно ИМХО.
public int addValue(final int value) {
return super.memberVariable + value;
}
Вот более короткий пример, который я буду регистрировать как сообщение об ошибке в сообщении об ошибке, поскольку оно не приводит к решению проблемы.
public enum MyEnum {
One {
public int getMemberVariableFailes() {
// error: non-static variable memberVariable cannot be referenced from a static context
return memberVariable;
}
public int getMemberVariable2OK() {
return memberVariable2;
}
public int getMemberVariableOK() {
return super.memberVariable;
}
};
private final int memberVariable = 1;
final int memberVariable2 = 1;
}
Основываясь на отзывах Тома Хоукина, этот пример получает то же сообщение об ошибке.
public class MyNotEnum {
// this is the static context in which the anonymous is created
public static final MyNotEnum One = new MyNotEnum() {
public int getMemberVariableFailes() {
// error: non-static variable memberVariable cannot be referenced from a static context
return memberVariable;
}
public int getMemberVariableOK() {
return super.memberVariable;
}
};
private final int memberVariable = 1;
}
для сравнения
public class MyNotEnum {
public class NestedNotEnum extends MyNotEnum {
public int getMemberVariableFailes() {
// compiles just fine.
return memberVariable;
}
public int getMemberVariableOK() {
return super.memberVariable;
}
}
private final int memberVariable = 1;
}