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

Java 除了在枚举声明中之外,还有更多枚举类型实例的缺点是什么?,java,enums,jls,Java,Enums,Jls,尝试显式实例化枚举类型是编译时错误 (§15.9.1)。Enum中的最终克隆方法确保永远不能克隆Enum常量,序列化机制的特殊处理确保永远不会由于反序列化而创建重复实例。禁止枚举类型的反射实例化。这四个因素共同确保枚举类型的实例不存在于枚举常量定义的实例之外 拥有更多枚举类型的实例而不是枚举中的实例有什么缺点 声明?缺点是您放弃了枚举的静态可检查性 您可以静态地确保枚举值上的开关确实可以处理所有情况。您可以静态地确保使用枚举调用方法是正确的。您可以静态地确保资源包中的每个枚举值都有一个转换。还有

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

(§15.9.1)。Enum中的最终克隆方法确保永远不能克隆Enum常量,序列化机制的特殊处理确保永远不会由于反序列化而创建重复实例。禁止枚举类型的反射实例化。这四个因素共同确保枚举类型的实例不存在于枚举常量定义的实例之外

拥有更多枚举类型的实例而不是枚举中的实例有什么缺点
声明?

缺点是您放弃了枚举的静态可检查性

您可以静态地确保枚举值上的
开关
确实可以处理所有情况。您可以静态地确保使用枚举调用方法是正确的。您可以静态地确保资源包中的每个枚举值都有一个转换。还有更多的事情

您可以确保
equals()
等同于带有枚举的
=

所有这些定义了
enum


如果您想要与枚举“相似”的东西,那么就编写它:它不太难。

它会破坏比较。你想要

if (myEnumValue == yourEnumValue)
{
}

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

好吧,我想这会引起混淆,因为人们希望能够使用
=
与枚举进行比较。能够克隆将破坏语义。

如果您有两个枚举,则以下指令可能为真或假

public boolean isEnumBlack(EnumType enum) {
    if (enum == EnumType.BLACK) {
        return true;
    } else {
        return false;
    }
}
然后,如果您使用EnumType的“实例”调用此方法,则BLACK。。。那么它就不会返回真值


isEnumBlack(黑色)
将返回false,即使根据代码,它应该返回true。Enum的将不再是Enum的

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

我想知道为什么您需要一个枚举类型的多个实例?枚举用于表示一组固定的常量,因此,通过拥有一个常量的多个实例,这与想要在整数集中拥有多个“数字5”是一样的。我的反问是:一个枚举类型有多个实例有什么好处?为什么我不能通过构造函数给出不同的值,而不是给出相同的值