web-dev-qa-db-fra.com

enum.values ​​() - est un ordre des énumérations retournées déterministes

J'ai une énumération SOME_ENUM:

public enum SOME_ENUM {
  EN_ONE,
  EN_TWO,
  EN_THREE;
}

SOME_ENUM.values() renverra-t-il toujours les énumérations dans l'ordre des déclarations d'énumération: EN_ONE, EN_TWO, EN_THREE? Est-ce une règle ou il n'est pas garanti de ne pas être modifié dans les prochaines versions de JDK?

96
Skarab

La spécification de langage Java utilise ce langage explicite:

@return un tableau contenant les constantes de ce type enum, dans l'ordre où elles sont déclarées [La source]

Donc, oui, ils seront retournés dans l'ordre de déclaration. Il convient de noter que l'ordre peut changer au fil du temps si quelqu'un change de classe, alors soyez très prudent sur la façon dont vous utilisez cela.

136
GaryF

Oui, il est garanti de les retourner dans cet ordre.

Cependant, vous devez éviter de vous fier à cela et à la valeur ordinal(), car elle peut changer après l'insertion de nouveaux éléments, par exemple.

16
Bozho

Il est déterminé par l'ordre dans lequel vos valeurs sont déclarées. Cependant, il n'y a aucune garantie que vous (ou quelqu'un d'autre) ne réorganiserez/insérerez/supprimerez pas de valeurs à l'avenir. Vous ne devez donc pas vous fier à la commande.

Efficace Java 2nd. Edition consacre son article 31 à un sujet étroitement lié: tiliser des champs d'instance au lieu d'ordinaux:

Ne dérivez jamais une valeur associée à une énumération de son ordinal; stockez-le à la place dans un champ d'instance.

9
Péter Török

Les autres réponses sont bonnes, mais ne commentez pas ceci:

"Est-ce une règle ou il n'est pas garanti de ne pas être modifié dans les prochaines versions de Jdk?"

Je ne crois pas qu'il existe de garanties sur les futurs JDK, vous ne devriez donc même pas vous en préoccuper. Il n'y aurait aucun moyen de les faire respecter, les futurs dirigeants du JDK pourraient simplement décider de renier ces garanties. C'est comme le système parlementaire de Westminster: "Aucun Parlement ne peut lier un futur parlement."

Cela dit, l'histoire du JDK révèle une excellente cohérence. Ils n'apportent pas beaucoup de changements, vous pouvez donc être assez sûr que le comportement actuel spécifié (pas seulement observé) sera préservé.

7
Fletch