2

尝试显式实例化枚举类型是编译时错误

(§15.9.1)。Enum 中的 final clone 方法确保了枚举常量永远不会被克隆,而序列化机制的特殊处理确保了不会因为反序列化而创建重复的实例。禁止枚举类型的反射实例化。这四件事一起确保枚举类型的实例不存在超出枚举常量定义的实例。

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

4

5 回答 5

5

缺点是你抛弃了枚举的静态可检查性。

您可以静态地确保switch枚举值上的 a 确实可以处理所有情况。您可以静态地确保调用带有枚举的方法是正常的。您可以静态确保资源包中的每个枚举值都有翻译。还有更多的东西。

您可以确保这与枚举equals()等效。==

所有这些都定义了一个enum.

如果你想要一些与枚举“相似”的东西,那就写吧:这并不难。

于 2011-01-27T12:23:47.180 回答
2

它会打破比较。你要

if (myEnumValue == yourEnumValue)
{
}

要工作,如果可能有相同枚举值的多个实例,则不能保证像这样的基于引用的测试会起作用。与字符串进行比较。

于 2011-01-27T12:24:59.943 回答
1

好吧,我想这会引起混乱,因为人们希望能够使用==. 能够克隆会破坏语义。

于 2011-01-27T12:26:21.827 回答
0

如果您有两个枚举,那么以下说明可能是对或错...

public boolean isEnumBlack(EnumType enum) {
    if (enum == EnumType.BLACK) {
        return true;
    } else {
        return false;
    }
}

然后,如果您使用 EnumType、BLACK 的“实例”调用此方法......那么它将不会返回 true。

isEnumBlack(BLACK)将返回 false,即使根据代码它应该返回 true。枚举将不再是枚举!

于 2011-01-27T12:41:36.963 回答
0

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

于 2011-01-27T16:00:21.470 回答