¿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?

romano
fuente

Respuestas:

154
Object[] possibleValues = enumValue.getDeclaringClass().getEnumConstants();
ColinD
fuente
¿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();
alguien
fuente
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.

RodeoPayaso
fuente
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

Rajesh Dixit
fuente
7

... o MyEnum.values ​​()? ¿O me estoy perdiendo algo?

eliminado
fuente
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);
    });
Ashwani Sharma
fuente
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);
}
David Lilljegren
fuente