代码之家  ›  专栏  ›  技术社区  ›  Skarab

enum.values()-返回的枚举的顺序具有确定性

  •  94
  • Skarab  · 技术社区  · 14 年前

    我有一个枚举 SOME_ENUM :

    public enum SOME_ENUM {
      EN_ONE,
      EN_TWO,
      EN_THREE;
    }
    

    威尔 SOME_ENUM.values() 始终按枚举声明的顺序返回枚举: EN_ONE, EN_TWO, EN_THREE ?它是一个规则还是不能保证在下一个JDK版本中不会被更改?

    4 回复  |  直到 7 年前
        1
  •  134
  •   Dan Grahn    9 年前

    Java语言规范使用此显式语言:

    @返回一个数组,该数组包含此枚举类型的常量,其声明顺序为 [Source]

    所以,是的,它们将按申报顺序返回。值得注意的是,如果有人更改了类,那么顺序可能会随着时间而改变,因此要非常小心如何使用它。

        2
  •  15
  •   Bozho    14 年前

    是的,我们保证按顺序退货。

    但是,你应该避免依赖它,并且 ordinal() 值,因为它可以在插入新项后更改,例如。

        3
  •  9
  •   Péter Török    14 年前

    它由值的声明顺序决定。然而, 不能保证您(或其他人)将来不会重新排序/插入/删除值 . 所以你不应该依赖命令。

    有效的Java第二。版本将其第31项专门用于一个密切相关的主题: 使用实例字段而不是序号 :

    从不从枚举的序号中派生与枚举关联的值;而是将其存储在实例字段中。

        4
  •  7
  •   Fletch    12 年前

    其他答案都很好,但不要对此发表评论:

    “这是一条规则,还是不能保证在下一个规则中不会改变? JDK发布?“

    我不相信对未来JDK的保证存在,所以你甚至不应该担心它们。没有办法强制执行它们,未来的JDK领导人可能只是决定背弃这些保证。这就像威斯敏斯特议会制度:“没有议会能约束未来的议会。”

    也就是说,JDK的历史显示出非常好的一致性。他们不会做出很多突破性的改变,所以你可以很有信心 明确规定 (不仅仅是观察)行为将被保留。