web-dev-qa-db-fra.com

Puis-je spécifier 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 enum?

66
Keating Wang

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

Renvoie l'ordinal de cette constante d'énumération (sa position dans sa déclaration enum, où la constante initiale se voit attribuer un ordinal égal à 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 telles que EnumSet et EnumMap.

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

62
Bozho

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

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.

83
Matt

Vous pouvez mettre à jour l'ordinal en utilisant la réflexion:

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);
    }
}
4
Sllouyssgort

Comme le souligne la réponse acceptée, vous ne pouvez pas définir l'ordinal. Le plus proche que vous pouvez obtenir c'est avec ne 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 de enum commencent à 0 (ne 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 article.

4
blubb

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 est affectée à 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 telles que EnumSet et EnumMap.

Returns: l'ordinal de cette constante d'énumération

Si tu as

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

alors DIMANCHE a un ordinal de 0, LUNDI est de 1, et ainsi de suite ...

2
SJuan76

Découvrez les Java exemples énumérés et docs

Renvoie l'ordinal de cette constante d'énumération (sa position dans sa déclaration enum, où la constante initiale se voit attribuer un ordinal égal à 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 telles que EnumSet et EnumMap.

0
Piyush Mattoo