根据Oracle 网站上的 Java 教程:
枚举类型是一种特殊的数据类型,它使变量能够成为一组预定义的常量。该变量必须等于为其预定义的值之一。
我同意这些值是预定义的。但它们真的是常数吗?
可以通过更改数据成员的enum
值来更改值。那么,它们在逻辑上可以称为常量吗?
假设我有一个enum
如下:
public enum Color
{
BLACK("0x000000"), WHITE("0xffffff");
Color(String rgbValue)
{
this.rgbValue = rgbValue;
}
private String rgbValue;
public String getRgbValue()
{
return this.rgbValue;
}
public void setRgbValue(String rgbValue)
{
this.rgbValue = rgbValue;
}
}
在上面,我可以使用 setterenum
更改 , 的值。rgbValue
如果我执行以下一组语句,状态BLACK
就会改变。
System.out.println(Color.BLACK.getRgbValue());
Color.BLACK.setRgbValue("0x000010");
System.out.println(Color.BLACK.getRgbValue());
上面的代码产生以下输出:
0x000000
0x000010
那么我们真的可以将enum
值称为常量吗?enum
不应该阻止值的状态改变吗?enum
不应该默认声明中的数据成员final
,以便enum
可以真正称为常量吗?
如果 的状态enum
不是守恒的,那么除了创建的预定义数量的对象之外,正常class
和enum
分开有什么区别?
还是有特定的原因,为什么 Java 设计者保留了这个功能?