Comment obtenir toutes les valeurs d'énumération en Java?

95

Je suis tombé sur ce problème que j'ai sans connaître le enumtype réel dont j'ai besoin pour itérer ses valeurs possibles.

if (value instanceof Enum){
   Enum enumValue = (Enum)value;
}

Des idées comment extraire de enumValue ses valeurs possibles?

romain
la source

Réponses:

154
Object[] possibleValues = enumValue.getDeclaringClass().getEnumConstants();
ColinD
la source
Pourquoi utilisez-vous getDeclaringClass ()?
Peter Kriens
3
@PeterKriens: Parce getClass()qu'un enumobjet peut renvoyer un sous - enumtype du type lui-même (si, par exemple, la enumconstante remplace une méthode du enumtype). getDeclaringClass()renvoie le enumtype qui a déclaré cette constante, ce que vous voulez ici.
ColinD le
Merci! Je n'avais pas réalisé ce cas mais vous avez raison, la constante peut être d'une classe interne anonyme.
Peter Kriens
97
YourEnumClass[] yourEnums = YourEnumClass.class.getEnumConstants();

Ou

YourEnumClass[] yourEnums = YourEnumClass.values();
Quelqu'un
la source
YourEnumClass[] yourEnums = YourEnumClass.class.getEnumConstants();a résolu mon problème d'appel à partir d'une méthode non statique.
Jeremy
15

Enums sont comme Classes en ce sens qu'ils sont tapés. Votre code actuel vérifie simplement s'il s'agit d'un Enum sans spécifier le type d'Enum dont il fait partie.

Étant donné que vous n'avez pas spécifié le type de l'énumération, vous devrez utiliser la réflexion pour savoir quelle est la liste des valeurs d'énumération.

Vous pouvez le faire comme ceci:

enumValue.getDeclaringClass().getEnumConstants() 

Cela renverra un tableau d'objets Enum, chacun étant l'une des options disponibles.

RodéoClown
la source
14

values ​​méthode d'énumération

enum.values ​​() qui renvoie toutes les instances enum.

  public class EnumTest {
        private enum Currency {
        PENNY("1 rs"), NICKLE("5 rs"), DIME("10 rs"), QUARTER("25 rs");
        private String value;
        private Currency(String brand) {
              this.value = brand;
        }

        @Override
        public String toString() {
              return value;
        }
  }

  public static void main(String args[]) {

        Currency[] currencies = Currency.values();

        // enum name using name method
        // enum to String using toString() method
        for (Currency currency : currencies) {
              System.out.printf("[ Currency : %s,
                         Value : %s ]%n",currency.name(),currency);
        }
  }
}

http://javaexplorer03.blogspot.in/2015/10/name-and-values-method-of-enum.html

Rajesh Dixit
la source
7

... ou MyEnum.values ​​()? Ou est-ce que je manque quelque chose?

supprimé
la source
2
Oui, la classe réelle de l'énumération n'est pas disponible ici pour faire un appel de méthode statique, juste une instance d'un sous-type de Enum.
ColinD le
3

Ici, Role est une énumération qui contient les valeurs suivantes [ADMIN, USER, OTHER].

List<Role> roleList = Arrays.asList(Role.values());
roleList.forEach(role -> {
    System.out.println(role);
    });
Ashwani Sharma
la source
Cependant, ce n'est pas générique. La question concerne le cas où seuls l'objet Enum. Vous devez donc passer par la classe déclarante ou mieux, via EnumSet.
zeratul021
3

On peut également utiliser le java.util.EnumSet comme ceci

@Test
void test(){
    Enum aEnum =DayOfWeek.MONDAY;
    printAll(aEnum);
}

void printAll(Enum value){
    Set allValues = EnumSet.allOf(value.getClass());
    System.out.println(allValues);
}
David Lilljegren
la source