除了enum声明之外,有更多枚举类型实例的缺点是什么?

时间:2011-01-27 12:20:16

标签: java enums jls

尝试显式实例化枚举类型

是编译时错误

(§15.9.1)。 Enum中的最终克隆方法确保永远不会克隆枚举常量,并且序列化机制的特殊处理可确保不会因反序列化而创建重复实例。禁止对枚举类型进行反射实例化。总之,这四件事确保在枚举常量定义的范围之外不存在枚举类型的实例。

除了在枚举中有更多枚举类型的实例有什么缺点 声明?

5 个答案:

答案 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)

除了所有其他好的答案之外,它还会中断EnumSetEnumSet根据枚举的大小实现为单个longlong个数组,其中每个位表示包含或排除一个特定的枚举值。如果枚举的数量和顺序不是恒定的,这将不起作用。