Wie bekomme ich alle Enum-Werte in Java?


95

Ich bin auf das Problem enumgestoßen, dass ich, ohne den tatsächlichen Typ zu kennen, die möglichen Werte durchlaufen muss.

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

Irgendwelche Ideen, wie man aus enumValue seine möglichen Werte extrahiert?

Antworten:


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

Warum verwenden Sie die getDeclaringClass ()?
Peter Kriens

3
@PeterKriens: Da getClass()auf einem enumObjekt möglicherweise ein Subtyp des enumTyps selbst zurückgegeben wird (wenn beispielsweise die enumKonstante eine Methode aus dem enumTyp überschreibt ). getDeclaringClass()Gibt den enumTyp zurück, der diese Konstante deklariert hat. Dies ist das, was Sie hier wollen.
ColinD

Vielen Dank! Ich hatte diesen Fall nicht erkannt, aber Sie haben Recht, die Konstante kann einer anonymen inneren Klasse angehören.
Peter Kriens

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

Oder

YourEnumClass[] yourEnums = YourEnumClass.values();

YourEnumClass[] yourEnums = YourEnumClass.class.getEnumConstants();löste mein Problem des Aufrufs von einer nicht statischen Methode.
Jeremy

15

Enums sind genau wie Classes darin, dass sie getippt sind. Ihr aktueller Code prüft nur, ob es sich um eine Aufzählung handelt, ohne anzugeben, zu welcher Art von Aufzählung er gehört.

Da Sie den Typ der Aufzählung nicht angegeben haben, müssen Sie Reflection verwenden, um herauszufinden, wie die Liste der Aufzählungswerte lautet.

Sie können es so machen:

enumValue.getDeclaringClass().getEnumConstants() 

Dadurch wird ein Array von Enum-Objekten zurückgegeben, von denen jedes eine der verfügbaren Optionen ist.


14

Werte Methode der Aufzählung

enum.values ​​() -Methode, die alle Enum-Instanzen zurückgibt.

  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

... oder MyEnum.values ​​()? Oder fehlt mir etwas?


2
Ja, die tatsächliche Klasse der Aufzählung ist hier nicht verfügbar, um einen statischen Methodenaufruf durchzuführen, sondern nur eine Instanz eines Subtyps von Enum.
ColinD

3

Hier ist Role eine Aufzählung, die die folgenden Werte enthält [ADMIN, USER, OTHER].

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

Dies ist jedoch nicht generisch. Frage ist über den Fall, wenn nur das Enum-Objekt haben. Sie müssen also entweder über die deklarierende Klasse oder besser über EnumSet gehen.
zeratul021

3

Man kann auch das java.util.EnumSet so verwenden

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

void printAll(Enum value){
    Set allValues = EnumSet.allOf(value.getClass());
    System.out.println(allValues);
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.