web-dev-qa-db-ja.com

enum.values()-返される列挙の順序は決定論的

Enum _SOME_ENUM_があります:

_public enum SOME_ENUM {
  EN_ONE,
  EN_TWO,
  EN_THREE;
}
_

SOME_ENUM.values()は常に列挙型宣言の順に列挙型を返します:_EN_ONE, EN_TWO, EN_THREE_?それはルールですか、それとも次のJDKリリースで変更されないことが保証されていませんか?

96
Skarab

Java言語仕様はこの明示的な言語を使用します:

@この列挙型の定数を含む配列を宣言された順序で返します [ソース]

そのため、はい、それらは宣言順に返されます。誰かがクラスを変更すると、時間の経過とともに順序が変わる可能性があるため、これをどのように使用するかに非常に注意してください。

136
GaryF

はい、それらをこの順序で返すことが保証されています。

ただし、たとえば、新しいアイテムを挿入した後に変更される可能性があるため、この値とordinal()値に依存することは避けてください。

16
Bozho

値が宣言されている順序によって決まります。ただし、あなた(または他の誰か)が将来値を並べ替え/挿入/削除しないという保証はありません。したがって、順序に依存しないでください。

Effective Java 2nd。EditionはItem 31を密接に関連するトピックに捧げます:序数の代わりにインスタンスフィールドを使用

順序から列挙型に関連付けられた値を導出しないでください。代わりにインスタンスフィールドに保存します。

9
Péter Török

他の答えは良いですが、これについてコメントしないでください:

「それはルールですか、それとも次のJdkリリースで変更されないことが保証されていませんか?」

将来のJDKに保証があるとは思わないので、心配する必要もありません。それらを強制する方法はありません。将来のJDKリードは、そのような保証を放棄することを決定するかもしれません。ウェストミンスターの議会制度のようなものです。「議会は将来の議会を縛ることはできません。」

そうは言っても、JDKの歴史は優れた一貫性を明らかにしています。それらは多くの重大な変更を加えないので、現在の指定(観察されただけでなく)の動作が保持されると確信できます。

7
Fletch