Die Fehlermeldung ist verwirrend.
Das Problem ist, dass Sie eine anonyme Unterklasse der Aufzählung erstellen, wenn Sie einen Aufzählungswert codieren. (Ihre Klasse wird EnumWithAbstractMethodAndMembers$1
) Eine Unterklasse kann nicht auf die privaten Mitglieder ihrer Oberklasse zugreifen, verschachtelte Klassen können dies jedoch über eine generierte Accessor-Methode. Sie sollten in der Lage sein, auf das private Feld zuzugreifen, und die Fehlermeldung, die Sie erhalten, scheint irreführend zu sein.
BTW Sie können dies verwenden, aber Sie sollten es IMHO nicht brauchen.
public int addValue(final int value) {
return super.memberVariable + value;
}
Hier ist ein kürzeres Beispiel, das ich als Fehler in der Fehlermeldung protokollieren werde, da es nicht zu einer Lösung des Problems führt.
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;
}
Aufgrund der Rückmeldung von Tom Hawkin erhält dieses Beispiel die gleiche Fehlermeldung.
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;
}
zum Vergleich
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;
}