为什么枚举实现不能访问枚举类中的私有字段

Tim*_*m B 27 java enums

我刚刚回答了这个问题,说如何解决编译问题:

如何通过重写方法在java枚举中使用字段?

但我不明白为什么错误发生在一开始.

以下是以枚举形式编写的示例:

public enum MyEnum {


    FIRST {
        @Override
        public String doIt() {
            return "1: " + someField; //error
        }
    },
    SECOND {
        @Override
        public String doIt() {
            return "2: " + super.someField; //no error
        }
    };

    private String someField;


    public abstract String doIt();

} 
Run Code Online (Sandbox Code Playgroud)

这与抽象类完全相同

abstract class MyClass {
    class FIRST extends MyClass {
        @Override
        public String doIt() {
            return "1: " + someField; //no error
        }
    };
    class SECOND extends MyClass {
        @Override
        public String doIt() {
            return "2: " + super.someField; //no error
        }
    };

    private String someField;

    public abstract String doIt();
}
Run Code Online (Sandbox Code Playgroud)

在的情况下,FIRST在内部enum实现它无法访问someField.但是在抽象类的情况下它可以.

另外添加super修复问题,就像删除private字段上的修饰符一样.

有谁知道为什么这种轻微的怪癖会发生在行为中?

sp0*_*00m 15

你的抽象类不等同于你的枚举,因为枚举是隐式公共静态最终的.因此,如果您使用以下内容,您将观察到相同的行为:

abstract class MyClass {

    static class FIRST extends MyClass {

        @Override
        public String doIt() {
            return "1: " + someField; // error
        }

    };

    static class SECOND extends MyClass {

        @Override
        public String doIt() {
            return "2: " + super.someField; // no error
        }

    };

    private String someField;

    public abstract String doIt();

}
Run Code Online (Sandbox Code Playgroud)

http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html中的 "静态嵌套类"一章所述:

静态嵌套类不能直接引用其封闭类中定义的实例变量或方法:它只能通过对象引用来使用它们.

因此需要super.this如果字段protected不是,你也可以使用private.