向枚举字段添加"private"会更改静态上下文



我希望有人解释一下这个文件导致的编译错误:

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"

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

复制相反的

如何使用字段在java enum覆盖的方法?

首先,如果你不介意向权威机构求助,Jon Skeet对这个问题的评论是:"这很奇怪——我很惊讶重写被视为静态上下文。"注意,将字段设置为protected会删除错误,这也是奇怪的…"

据我所知,在拉斐尔的精彩回答中,他从来没有提到过这个奇怪的事情。是的,AB相当于静态嵌套类,但静态内部类大致相当于普通的顶级类:这并不意味着类的所有方法和字段都是静态的。枚举的方法在静态上下文中吗?所以在拉斐尔的回答中,doIt方法实际上是静态方法,即使它们没有这样标记?

试试这个

     ((TestEnum)this).x

错误信息是误导。问题是,private字段不被继承,因此xthis.x将无法编译。你必须将它向上强制转换到父类才能访问它。

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

这里的"protected"访问可能更好

    protected int x;

最新更新