根据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;
}
}
Run Code Online (Sandbox Code Playgroud)
在上面enum,我可以rgbValue通过使用setter 更改值.如果我执行以下语句集,则状态BLACK会发生变化.
System.out.println(Color.BLACK.getRgbValue());
Color.BLACK.setRgbValue("0x000010");
System.out.println(Color.BLACK.getRgbValue());
Run Code Online (Sandbox Code Playgroud)
上面的代码产生以下输出:
0x000000
0x000010
Run Code Online (Sandbox Code Playgroud)
那么我们真的可以将enum值称为常量吗?是否应该enum防止价值状态发生变化?不应该将数据成员enum声明为final默认值,以便enum可以真正称为常量吗?
如果enum未保存状态,那么正常class与enum预定数量的对象之间的区别是什么?
或者有一个特定的原因,为什么Java设计师保留了这个功能?
什么是一成不变的,什么是static final在默认情况下,是枚举值(以自己的知名度改性剂,即public,private或默认,它是从枚举的声明本身继承).
但这些价值观本身就属于阶级; 因此,这种不变性不适用于它们的实例变量(如果有的话).
为了使完整的枚举不可变:
final,在枚举使用最简单的情况下(即public class MyEnum { VALUE1, VALUE2 }),实例变量不变性不是问题,因为它们没有.
但是只要将实例变量添加到枚举中,就会应用与这些实例变量相同的约束,就像它们对任何其他Java类一样(即使所说的类是final).因为,最终,枚举实例本身就是类.他们恰好是单身人士final,而且extends Enum<ThemSelves>.
在你的例子中,你rgbValue必须如此final.这样,既然String是一个不可变的类,你的枚举将"真正"成为不可变的.
奇怪的是,您可以想到的最佳默认不变性是在...接口:
public interface Foo
{
int bar = 3; // bar is "public", "static" AND "final" by default
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
859 次 |
| 最近记录: |