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?

römisch
quelle

Antworten:

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

RodeoClown
quelle
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

Rajesh Dixit
quelle
7

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

gelöscht
quelle
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);
    });
Ashwani Sharma
quelle
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);
}
David Lilljegren
quelle