繁体   English   中英

Java - 从重写的方法访问枚举的私有字段

[英]Java - accessing private fields of enum from overridden methods

我在玩枚举,我发现这段代码无法编译:

class TrafficLight{
    enum Color{
        RED(23){
            private int y=5;
            @Override
            public int sum(){
                return val+y;
            }
        }, 
        GREEN(24);
        private int val;
        Color(int x){
            val=x;
        }
        public int sum(){
            return val;
        }
    }
}

错误是: non-static variable cannot be referenced from a static context

但是,如果我更改val上的访问修饰符以保护代码编译没有问题。

我试图理解为什么会发生这种情况。 有人告诉我,我可以将枚举视为具有匿名子类(每个离散值一个子类)的 static class。

我想它可能有点合适,因为如果该字段受到保护,它可以从RED内部访问,但因为RED没有自己的构造函数,他自己的val不会被初始化,所以如果val是私有的,它不会没有任何东西可以访问。

我想知道这是否是思考枚举的正确方法,以及我的解释是否合理。

非常感谢。

我认为枚举是不可变的值类,其中的值代表所有可能的实例。 我什至不知道可以对枚举进行子类化。

由于语法歧义,编译器消息具有误导性。 如果您将对val的引用更改为this.val ,您应该会收到更合适的消息:

字段 TrafficLight.Color.val 不可见

这清楚地描述了这个问题。 在这种情况下,使其受保护将解决编译错误。 实际上,实例RED的类型是继承自Color的匿名 class 。 如果var是受保护的(或者实际上是非私有的),它将从RED的匿名 class 的代码中可见。

In Java, Enum class is a special class but it still compliance with Java scope.

在 Java 中,子 class 无法访问任何私有方法,来自父 class 的变量。

对于上述问题, enum Red正在扩展 Color class (并且只有 enum 中的值可以扩展它)。 为了从Color访问val的值,您可以将 scope 从

private int val;

int val;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM