Como obter todos os valores enum em Java?

95

Eu me deparei com esse problema sem saber o enumtipo real de que preciso para iterar seus valores possíveis.

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

Alguma idéia de como extrair de enumValue seus valores possíveis?

romano
fonte

Respostas:

154
Object[] possibleValues = enumValue.getDeclaringClass().getEnumConstants();
ColinD
fonte
Por que você usa getDeclaringClass ()?
Peter Kriens de
3
@PeterKriens: Porque getClass()em um enumobjeto pode retornar um subtipo do enumpróprio tipo (se, digamos, a enumconstante substitui um método do enumtipo). getDeclaringClass()retorna o enumtipo que declarou aquela constante, que é o que você deseja aqui.
ColinD de
Obrigado! Eu não tinha percebido esse caso, mas você está certo, a constante pode ser de uma classe interna anônima.
Peter Kriens
97
YourEnumClass[] yourEnums = YourEnumClass.class.getEnumConstants();

Ou

YourEnumClass[] yourEnums = YourEnumClass.values();
alguém
fonte
YourEnumClass[] yourEnums = YourEnumClass.class.getEnumConstants();resolveu meu problema de chamada de um método não estático.
Jeremy
15

Enums são como Class es no sentido de que são digitados. Seu código atual apenas verifica se é um Enum sem especificar de que tipo de Enum faz parte.

Como você não especificou o tipo de enum, terá que usar reflexão para descobrir qual é a lista de valores de enum.

Você pode fazer assim:

enumValue.getDeclaringClass().getEnumConstants() 

Isso retornará uma matriz de objetos Enum, com cada um sendo uma das opções disponíveis.

RodeoClown
fonte
14

método de valores de enum

método enum.values ​​() que retorna todas as instâncias de 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
fonte
7

... ou MyEnum.values ​​()? Ou eu estou esquecendo de alguma coisa?

apagado
fonte
2
Sim, a classe real do enum não está disponível aqui para fazer uma chamada de método estático, apenas uma instância de algum subtipo de Enum.
ColinD de
3

Aqui, Role é um enum que contém os seguintes valores [ADMIN, USER, OTHER].

List<Role> roleList = Arrays.asList(Role.values());
roleList.forEach(role -> {
    System.out.println(role);
    });
Ashwani Sharma
fonte
No entanto, isso não é genérico. A questão é sobre o caso quando apenas temos o objeto Enum. Portanto, você precisa ir por declarar classe ou, melhor, por EnumSet.
zeratul021
3

Também é possível usar o java.util.EnumSet desta forma

@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
fonte