嵌套枚举无法访问枚举类的私有字段

时间:2015-12-28 08:54:37

标签: java enums

当嵌套的枚举类尝试访问外部时,它会收到有关无法访问静态上下文中的非静态字段的错误消息。但是,使字段包本地化,或使用super关键字“修复”问题,这在错误消息中并不明显。

如果枚举是一个嵌套类,它将没有三重奏

public enum EnumExample {
One {
    public int getMemberVariableFailes() {
        // error: non-static variable memberVariable cannot be referenced from a static context
        return memberVariable;
    }

    public int getMemberVariableOK() {
        return super.memberVariable;
    }

    public int getMemberVariable2OK() {
        return memberVariable2;
    }
};

private final int memberVariable = 1;
final int memberVariable2 = 1;
}

预期 -

错误消息并未明确表示使用super。关键字会“修复”问题。它似乎不是正确的行为,但如果是错误消息则没有给出关于解决方案的指示。

实际 - 与以下内容相同。

However following compiles absolutely fine.

public class Enumtest {
public class NestedNotEnum extends Enumtest {
    public int getMemberVariableFailes() {
        // compiles just fine.
        return memberVariable;
    }

    public int getMemberVariableOK() {
        return super.memberVariable;
    }
}
private final int memberVariable = 1;
}

有人可以详细说明为什么会这样。

1 个答案:

答案 0 :(得分:0)

嗯,声明的enum和提供的内部类示例之间存在差异。您应该将枚举视为“静态嵌套类”和不是“内部类”。现在,提供的类示例转换为:

public class Enumtest
{
    static class NestedNotEnum extends Enumtest {
        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;
}

这些结果不符合您的期望吗?与EnumExample相同,请使用关键字super来解决问题。但是,这仍然很奇怪:

  

无法对非静态字段memberVariable

进行静态引用

因为我们仍然可以使用super

来引用memberVariable