java - 将 "private"添加到枚举字段会更改静态上下文

标签 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”

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

重复反驳

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

首先,如果您不介意向权威机构提出上诉,Jon Skeet通过说“这很奇怪 - 我很惊讶覆盖被视为静态上下文”评论了这个问题。请注意,使字段 protected 会删除错误,这也很奇怪......“

据我所知 Rafael's excellent answer ,他从不解决这个奇怪的问题。是的,AB相当于静态嵌套类,但是一个静态内部类大致相当于一个普通的顶层类:并不代表所有的该类的方法和字段也是静态的。枚举的方法是在静态上下文中吗?所以在 Rafael 的回答中,doIt 方法实际上是静态方法,即使它们没有被标记为静态方法?

最佳答案

试试这个

     ((TestEnum)this).x

错误信息具有误导性。问题是,private 字段不会被继承,因此 xthis.x 将无法编译。您必须将其向上转换为父类(super class)才能访问它。

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

“ protected ”访问在这里可能更好

    protected int x;

关于java - 将 "private"添加到枚举字段会更改静态上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31953448/

相关文章:

java - 我如何控制android mediaplayer?

c++ - 枚举和定义语句之间的区别

Swift 枚举 : Getting enum value for string enum from int value

python - 将 WTForms 与枚举一起使用

Java:如何使用 Lambda 重写——可以抛出异常

java - Eclipse Java,以编程方式从 Gmail SMTP 发送电子邮件

struct - Rust-引用结构的Enum变体

c++ - 可以在类中使用 C++20 中的 'using enum' 吗?

java - 如何将一周的第一天和一周的最后一天设置为白色?

java - 使用丑陋的条件语句重构方法