Puis-je spécifier un ordinal pour enum en Java?

La méthode ordinal() renvoie l’ordinal d’une instance enum.
Comment puis-je définir l’ordinal pour une énumération?

Vous ne pouvez pas le définir. C’est toujours l’ordinal de la définition constante. Voir la documentation de Enum.ordinal () :

Renvoie l’ordinal de cette constante d’énumération (sa position dans sa déclaration enum, où la constante initiale reçoit un ordinal de zéro). La plupart des programmeurs n’auront aucune utilité pour cette méthode. Il est conçu pour être utilisé par des structures de données sophistiquées basées sur des énumérations, telles que EnumSet et EnumMap.

Et en fait, vous ne devriez pas en avoir besoin. Si vous voulez une propriété entière, définissez-en une.

Vous pouvez contrôler l’ordinal en modifiant l’ordre de l’énumération, mais vous ne pouvez pas le définir explicitement comme en C++ . Une solution consiste à fournir une méthode supplémentaire dans votre enum pour le numéro que vous souhaitez:

 enum Foo { BAR(3), BAZ(5); private final int val; private Foo(int v) { val = v; } public int getVal() { return val; } } 

Dans cette situation BAR.ordinal() == 0 , mais BAR.getVal() == 3 .

Vous pouvez mettre à jour l’ordinal en utilisant la reflection:

 private void setEnumOrdinal(Enum object, int ordinal) { Field field; try { field = object.getClass().getSuperclass().getDeclaredField("ordinal"); field.setAccessible(true); field.set(object, ordinal); } catch (Exception ex) { throw new RuntimeException("Can't update enum ordinal: " + ex); } } 

De http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Enum.html

public final int ordinal () Retourne l’ordinal de cette constante d’énumération (sa position dans sa déclaration enum, où la constante initiale reçoit un ordinal de zéro). La plupart des programmeurs n’auront aucune utilité pour cette méthode. Il est conçu pour être utilisé par des structures de données sophistiquées basées sur des énumérations, telles que EnumSet et EnumMap.

Retourne: l’ordinal de cette constante d’énumération

Si tu as

Journée publique {DIMANCHE, LUNDI, MARDI, MERCREDI, JEUDI, VENDREDI, SAMEDI}

alors SUNDAY a un ordinal de 0, lundi est 1, et ainsi de suite …

Comme l’indique la réponse acceptée, vous ne pouvez pas définir l’ordinal. Le plus proche que vous pouvez obtenir est avec une propriété personnalisée :

 public enum MonthEnum { JANUARY(1), FEBRUARY(2), MARCH(3), APRIL(4), MAY(5), JUNE(6), JULY(7), AUGUST(8), SEPTEMBER(9), OCTOBER(10), NOVEMBER(11), DECEMBER(12); MonthEnum(int monthOfYear) { this.monthOfYear = monthOfYear; } private int monthOfYear; public int asMonthOfYear() { return monthOfYear; } } 

Remarque : Par défaut, les valeurs enum commencent à 0 (pas 1 ) si vous ne spécifiez pas de valeurs. De plus, les valeurs ne doivent pas être incrémentées de 1 pour chaque élément.

Découvrez les exemples et documents de Java Enum

Renvoie l’ordinal de cette constante d’énumération (sa position dans sa déclaration enum, où la constante initiale reçoit un ordinal de zéro). La plupart des programmeurs n’auront aucune utilité pour cette méthode. Il est conçu pour être utilisé par des structures de données sophistiquées basées sur des énumérations, telles que EnumSet et EnumMap.

La réponse facile: changez simplement l’ordre des constantes. Le premier défini sera 0, le second sera 1, etc. Cependant, cela peut ne pas être pratique si vous changez constamment de code ou si les énumérations contiennent beaucoup de valeurs. Vous pouvez définir une méthode personnalisée pour contourner l’ordinal par défaut, mais assurez-vous qu’il est bien documenté pour éviter toute confusion!

 public enum Values { ONE, TWO, THREE, FOUR; public int getCustomOrdinal() { if(this == ONE) { return 3; } else if(this == TWO) { return 0; } ... } }