web-dev-qa-db-fra.com

Comment obtenir la valeur numérique de l'énum?

Supposons que vous ayez

public enum Week {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
}

Comment peut-on obtenir int représentant que dimanche est 0, mercredi 3 etc?

33
JAM
Week week = Week.SUNDAY;

int i = week.ordinal();

Attention cependant, cette valeur changera si vous modifiez l'ordre des constantes enum dans la déclaration. Une façon de contourner ce problème consiste à attribuer soi-même une valeur int à toutes vos constantes enum comme ceci:

public enum Week 
{
     SUNDAY(0),
     MONDAY(1)

     private static final Map<Integer,Week> lookup 
          = new HashMap<Integer,Week>();

     static {
          for(Week w : EnumSet.allOf(Week.class))
               lookup.put(w.getCode(), w);
     }

     private int code;

     private Week(int code) {
          this.code = code;
     }

     public int getCode() { return code; }

     public static Week get(int code) { 
          return lookup.get(code); 
     }
}
86
Istvan Devai

Tu peux appeler:

MONDAY.ordinal()

mais personnellement, je voudrais ajouter un attribut à enum pour stocker la valeur, l'initialiser dans le constructeur enum et ajouter une fonction pour obtenir la valeur. Cela est préférable car la valeur de MONDAY.ordinal peut changer si les constantes enum sont déplacées.

8
vainolo

Jetez un coup d'oeil à l'API c'est généralement un endroit décent pour commencer. Bien que je n’aurais pas deviné sans avoir couru avant cela, vous appelez ENUM_NAME.ordinal ()

2
John Kane

Oui, utilisez simplement la méthode ordinale de l’objet enum.

public class Gtry {
  enum TestA {
    A1, A2, A3
  }

  public static void main(String[] args) {
    System.out.println(TestA.A2.ordinal());
    System.out.println(TestA.A1.ordinal());
    System.out.println(TestA.A3.ordinal());
  }

}

API:

/**
     * Returns the ordinal of this enumeration constant (its position
     * in its enum declaration, where the initial constant is assigned
     * an ordinal of zero).
     *
     * Most programmers will have no use for this method.  It is
     * designed for use by sophisticated enum-based data structures, such
     * as {@link Java.util.EnumSet} and {@link Java.util.EnumMap}.
     *
     * @return the ordinal of this enumeration constant
     */
    public final int ordinal() {
        return ordinal;
    }
0
Ganesa Vijayakumar