尝试显式实例化枚举类型
是编译时错误(§15.9.1)。 Enum中的最终克隆方法确保永远不会克隆枚举常量,并且序列化机制的特殊处理可确保不会因反序列化而创建重复实例。禁止对枚举类型进行反射实例化。总之,这四件事确保在枚举常量定义的范围之外不存在枚举类型的实例。
除了在枚举中有更多枚举类型的实例有什么缺点 声明?
答案 0 :(得分:5)
缺点是你丢弃了枚举的静态可检查性。
您可以静态地确保枚举值上的switch
确实可以处理所有情况。您可以静态地确保使用枚举调用方法可以做到理智。您可以静态地确保资源包中的每个枚举值都有一个转换。还有很多东西。
您可以确保equals()
与枚举相同的==
。
所有定义 enum
。
如果你想要一个与枚举“相似”的东西,那就写下来:它不是太难。
答案 1 :(得分:2)
这会破坏比较。你想要
if (myEnumValue == yourEnumValue)
{
}
工作,如果可能有多个相同枚举值的实例,则无法保证像这样的基于参考的测试可行。与字符串比较。
答案 2 :(得分:1)
嗯,我想这会引起混淆,因为人们希望能够使用==
与枚举进行比较。能够克隆会打破语义。
答案 3 :(得分:0)
如果您有两个枚举,那么以下说明可能是真或假......
public boolean isEnumBlack(EnumType enum) {
if (enum == EnumType.BLACK) {
return true;
} else {
return false;
}
}
然后,如果你使用EnumType的“实例”调用此方法,那么BLACK ......则不会返回true。
isEnumBlack(BLACK)
将返回false,即使根据代码它应该返回true。 Enum将不再是枚举!
答案 4 :(得分:0)
除了所有其他好的答案之外,它还会中断EnumSet
。 EnumSet
根据枚举的大小实现为单个long
或long
个数组,其中每个位表示包含或排除一个特定的枚举值。如果枚举的数量和顺序不是恒定的,这将不起作用。