考虑示例:
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的 吗?另外,既然value是private,为什么我可以在其他课程之外访问它?
value
private
似乎没有人解决私人方面的问题。我的猜测是您正在从包含类型访问私有字段-您的枚举 实际上 是嵌套类型,如下所示:
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,则仍可以向其添加条目,因为这不会修改 字段 本身。
VALUE1
VALUE1.value
List
如果要使其SomeEnum正确不变,请设置value字段final。
SomeEnum
final