无法使用私有变量对非静态字段memberVariable进行静态引用

And*_*eas 19 java enums

我用一个私有成员变量创建了一个枚举.当我尝试访问成员变量时,编译状态'无法对非静态字段memberVariable进行静态引用'.

如果变量不是私有的(例如受保护或包保护),则编译很好.我不明白变量的范围与实现的抽象函数的类型(静态,非静态)有什么关系.

有人可以开导我吗?

public enum EnumWithAbstractMethodAndMembers {
    TheOneAndOnly(1) {
        @Override
        public int addValue(final int value) {
            return memberVariable + value;
        }
    };

    private final int memberVariable;

    private EnumWithAbstractMethodAndMembers(final int memberVariable) {
        this.memberVariable = memberVariable;
    }

    abstract int addValue(int value);

}
Run Code Online (Sandbox Code Playgroud)

Pet*_*rey 21

错误消息令人困惑.

问题是当你给出一个枚举值代码时,你正在创建一个enum的匿名子类.(它的类将是EnumWithAbstractMethodAndMembers$1)一个子类不能访问其超类的私有成员,但是嵌套类可以通过生成的访问器方法.您应该能够访问私有字段,它给您的错误消息似乎是错误的.

BTW您可以使用此功能,但您不需要恕我直言.

    public int addValue(final int value) {
        return super.memberVariable + value;
    }
Run Code Online (Sandbox Code Playgroud)

这是一个较短的示例,我将在错误消息中记录为错误,因为它不会导致问题的解决方案.

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;
}
Run Code Online (Sandbox Code Playgroud)

根据Tom Hawkin的反馈,此示例获得相同的错误消息.

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;
}
Run Code Online (Sandbox Code Playgroud)

为了比较

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;
}
Run Code Online (Sandbox Code Playgroud)