一尘不染

Java枚举对私有实例变量的访问

java

考虑示例:

enum SomeEnum {
    VALUE1("value1"),
    VALUE2("value2"),
    VALUE3("value3")
    ;
    private String value;

    private SomeEnum(final String value) {
        this.value = value;
    }

    //toString
    public String toString() {
        return value;
    }
}

我们怎么能做到这一点(而价值 确实 发生了变化)?

SomeEnum.VALUE1.value = "Value4";
System.out.println(SomeEnum.VALUE1);

枚举实例不是隐式 静态的 并且是 final的 吗?另外,既然valueprivate,为什么我可以在其他课程之外访问它?


阅读 359

收藏
2020-12-03

共1个答案

一尘不染

似乎没有人解决私人方面的问题。我的猜测是您正在从包含类型访问私有字段-您的枚举 实际上 是嵌套类型,如下所示:

class Test
{
    static void Main() {
        // Entirely valid
        SomeEnum.VALUE1.value = "x";
    }

    enum SomeEnum {
        VALUE1("value1");

        private String value;

        private SomeEnum(final String value) {
            this.value = value;
        }
    }
}

这是完全合法和正常的-您 始终 可以从包含的类型访问嵌套类型的私有成员。

如果将枚举设置为顶级类型,则不会看到此信息。

至于更改值-
正如其他人所说的那样,VALUE1它隐式地是静态的和最终的,但这并不能阻止您进行更改VALUE1.value。再次重申,这完全符合Java在其他地方的工作方式-
如果您具有类型的静态字段List,则仍可以向其添加条目,因为这不会修改 字段 本身。

如果要使其SomeEnum正确不变,请设置value字段final

2020-12-03