Come ottenere tutti i valori enum in Java?


95

Mi sono imbattuto in questo problema che senza conoscere il enumtipo effettivo di cui ho bisogno per iterare i suoi possibili valori.

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

Qualche idea su come estrarre da enumValue i suoi possibili valori?

Risposte:


154
Object[] possibleValues = enumValue.getDeclaringClass().getEnumConstants();

Perché usi getDeclaringClass ()?
Peter Kriens

3
@ PeterKriens: Perché getClass()su un enumoggetto può restituire un sottotipo del enumtipo stesso (se, diciamo, la enumcostante sovrascrive un metodo dal enumtipo). getDeclaringClass()restituisce il enumtipo che ha dichiarato quella costante, che è quello che vuoi qui.
ColinD

Grazie! Non mi ero reso conto di quel caso ma hai ragione, la costante può essere di una classe interna anonima.
Peter Kriens

97
YourEnumClass[] yourEnums = YourEnumClass.class.getEnumConstants();

O

YourEnumClass[] yourEnums = YourEnumClass.values();

YourEnumClass[] yourEnums = YourEnumClass.class.getEnumConstants();ha risolto il mio problema di chiamata da un metodo non statico.
Jeremy

15

Enums sono proprio come Classes in quanto sono digitati. Il codice corrente controlla solo se si tratta di un Enum senza specificare il tipo di Enum di cui fa parte.

Poiché non hai specificato il tipo di enum, dovrai usare la reflection per scoprire qual è l'elenco dei valori di enum.

Puoi farlo in questo modo:

enumValue.getDeclaringClass().getEnumConstants() 

Ciò restituirà un array di oggetti Enum, ognuno dei quali è una delle opzioni disponibili.


14

metodo dei valori di enumerazione

enum.values ​​() che restituisce tutte le istanze di 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


7

... o MyEnum.values ​​()? Oppure mi sfugge qualcosa?


2
Sì, la classe effettiva dell'enum non è disponibile qui per effettuare una chiamata al metodo statico, ma solo un'istanza di un sottotipo di Enum.
ColinD,

3

In questo caso, il ruolo è un'enumerazione che contiene i seguenti valori [ADMIN, USER, OTHER].

List<Role> roleList = Arrays.asList(Role.values());
roleList.forEach(role -> {
    System.out.println(role);
    });

Tuttavia, questo non è generico. La domanda riguarda il caso in cui si ha solo l'oggetto Enum. Quindi è necessario passare tramite la dichiarazione della classe o, meglio, tramite EnumSet.
zeratul021

3

Si può anche usare java.util.EnumSet in questo modo

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

void printAll(Enum value){
    Set allValues = EnumSet.allOf(value.getClass());
    System.out.println(allValues);
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.