【问题标题】:What is the drawback of having more instances of enum type other than in the enum declaration?除了枚举声明之外,拥有更多枚举类型实例的缺点是什么?
【发布时间】:2011-01-27 12:20:16
【问题描述】:

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

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

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

【问题讨论】:

  • 我很想知道为什么您需要多个枚举类型的实例?枚举用于表示一组固定的常量,因此通过拥有多个常量实例,这与想要在一组整数中拥有多个“数字 5”是一样的。我的反问是:拥有多个枚举类型的实例有什么好处?

标签: java enums jls


【解决方案1】:

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

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

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

所有这些定义enum

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

【讨论】:

    【解决方案2】:

    它会破坏比较。你想要的

    if (myEnumValue == yourEnumValue)
    {
    }
    

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

    【讨论】:

    • 为什么我不能通过构造函数给出不同的值,而不是给出相同的值
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      如果你有两个枚举,那么下面的指令可能是真也可能是假...

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

      那么如果你用 EnumType 的“实例”调用这个方法,BLACK... 那么它就不会返回 true。

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-09-09
          • 1970-01-01
          • 2011-01-20
          • 2022-01-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多