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

Ska*_*rab 98 java enums specifications

我有一个枚举SOME_ENUM:

public enum SOME_ENUM {
  EN_ONE,
  EN_TWO,
  EN_THREE;
}
Run Code Online (Sandbox Code Playgroud)

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

Gar*_*ryF 137

Java语言规范使用这种显式语言:

@return一个包含此枚举类型常量的数组,按它们声明的顺序[来源]

所以,是的,它们将按照声明顺序返回.值得注意的是,如果有人改变了课程,订单可能会随着时间而改变,所以要非常小心你如何使用它.


Boz*_*zho 16

是的,保证按顺序返回它们.

但是,您应该避免依赖于该ordinal()值和值,因为例如,插入新项后它可能会更改.


Pét*_*rök 9

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

有效的Java第二.Edition将其第31项专用于一个密切相关的主题:使用实例字段而不是序数:

永远不要从序数中得出与枚举相关的值; 将其存储在实例字段中.

  • "不能保证有人不会在将来重新排序价值" - 但这正是我想依赖订单的原因:-)!我希望将来能够重新订购这些项目,从而改变我的程序的行为.Bloch对于不依赖序数是正确的,如果提问者的例子真的涉及像EN_TWO这样的枚举,那么他依靠序数而不应该这样做.但依靠订单完全没问题.事实上,由于订单是有保证的,创建一个专门用于订单的字段就是编写冗余代码,像Effective Java这样的书籍告诉你不要这样做. (3认同)

Fle*_*tch 7

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

"它是一个规则还是不保证在下一个Jdk版本中不会被更改?"

我不相信对未来JDK的保证,所以你甚至不应该担心它们.没有办法强制执行它们,未来的JDK主管可能会决定重新考虑这些保证.这就像威斯敏斯特议会制度:"没有议会可以约束未来的议会."

也就是说,JDK的历史表现出极好的一致性.它们不会进行大量重大更改,因此您可以非常确信将保留当前指定的(不仅仅是观察到的)行为.