¿Cómo obtener todos los valores de enumeración en Java?


95

Me encontré con este problema que, sin saber el enumtipo real , necesito iterar sus posibles valores.

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

¿Alguna idea de cómo extraer de enumValue sus posibles valores?

Respuestas:


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

¿Por qué usa getDeclaringClass ()?
Peter Kriens

3
@PeterKriens: Porque getClass()en un enumobjeto puede devolver un subtipo del enumtipo en sí (si, digamos, la enumconstante anula un método del enumtipo). getDeclaringClass()devuelve el enumtipo que declaró esa constante, que es lo que desea aquí.
ColinD

¡Gracias! No me había dado cuenta de ese caso pero tienes razón, la constante puede ser de una clase interior anónima.
Peter Kriens

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

O

YourEnumClass[] yourEnums = YourEnumClass.values();

YourEnumClass[] yourEnums = YourEnumClass.class.getEnumConstants();resolvió mi problema de llamar desde un método no estático.
Jeremy

15

Enums son como Classes en que se escriben. Su código actual simplemente verifica si es un Enum sin especificar de qué tipo de Enum es parte.

Debido a que no ha especificado el tipo de enumeración, tendrá que usar la reflexión para averiguar cuál es la lista de valores de enumeración.

Puedes hacerlo así:

enumValue.getDeclaringClass().getEnumConstants() 

Esto devolverá una matriz de objetos Enum, cada uno de los cuales será una de las opciones disponibles.


14

método de valores de enumeración

enum.values ​​() método que devuelve todas las instancias de enumeración.

  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 ​​()? ¿O me estoy perdiendo algo?


2
Sí, la clase real de la enumeración no está disponible aquí para realizar una llamada a un método estático, solo una instancia de algún subtipo de Enum.
ColinD

3

Aquí, Role es una enumeración que contiene los siguientes valores [ADMIN, USER, OTHER].

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

Sin embargo, esto no es genérico. La pregunta es sobre el caso cuando solo tiene el objeto Enum. Por lo tanto, debe ir declarando class o mejor, a través de EnumSet.
zeratul021

3

También se puede usar java.util.EnumSet así

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

void printAll(Enum value){
    Set allValues = EnumSet.allOf(value.getClass());
    System.out.println(allValues);
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.