将“private”添加到枚举字段会更改静态上下文

时间:2015-08-11 23:04:31

标签: java enums

我希望有人解释此文件导致的编译错误:

public enum TestEnum {
    A {
        @Override
        void someMethod() {
            System.out.println("A: " + x);
        }
    },
    B {
        @Override
        void someMethod() {
            System.out.println("B: " + x);
        }
    };
    private int x;
    abstract void someMethod();
}

编译错误是:

TestEnum.java:11: error: non-static variable x cannot be referenced from a static context
        System.out.println("B: " + x);

如果我删除private修饰符,则该类编译时没有错误。这似乎意味着someMethod是一个静态上下文(是吗?)并且删除int x上的访问修饰符使它成为一个静态变量(是吗?)。为什么会这样?

环境:

  • java版“1.8.0_51”

P.S。我正在尝试初始化枚举构造函数中的Properties字段,该字段委托给每个枚举实例的抽象init方法。这就是我遇到上述错误消息的地方。我不希望x/properties成为静态字段;它应该对每个枚举实例都是唯一的。

重复反驳

How to use fields in java enum by overriding the method?

首先,如果你不介意向某个机构提出上诉,Jon Skeet会对这个问题发表评论,说“这很奇怪 - 我很惊讶覆盖算作静态上下文。”受保护的字段会删除错误,这也是奇怪的......“

Rafael's excellent answer所述,他从未解决过这种奇怪的问题。是的,AB等同于静态嵌套类,但静态内部类大致相当于普通的顶级类:它并不意味着所有的方法和字段都是class也是静态的。枚举的方法是静态上下文吗?那么在Rafael的回答中,doIt方法实际上是静态方法,即使它们没有被标记为?

1 个答案:

答案 0 :(得分:1)

试试这个

     ((TestEnum)this).x

错误消息具有误导性。问题是,private字段未被继承,因此xthis.x无法编译。您必须将其上传到超类才能访问它。

另见https://groups.google.com/d/msg/java-lang-fans/KVmmgeSCHkA/Kr_KxaaeolIJ

受保护的'这里访问可能更好

    protected int x;