# ENUM auslesen (Name des ENUM als Variable)



## youpwnT (24. Mai 2012)

Guten Tag,

ich brüte seit einigen Stunden über folgendem Problem:

Ich habe mehrere enums geschrieben und möchte durch eine Klasse die Methode 
	
	
	
	





```
values()
```
 eines der enums aufrufen.

*Ich weiß aber vor Ausführung des Programms nicht welche enums existieren und welches ausgelesen werden muss.*

Mein Lösungsansatz war, den Namen des entsprechenden enums während der Laufzeit als 
	
	
	
	





```
String
```
 an die Klasse zu übergeben und das enum dann ungefähr so auszulesen:


> Pseudo-Code:
> 
> package_name.*VARIABLE_NAME*.method();


Das funktioniert so natürlich nicht, da in dem Fall ja nach der Klasse mit dem *Namen der Variable* gesucht wird, anstatt dem *Wert der Variable*.

Leider fällt mir aber nichts ein, wie ich dieses Problem lösen kann und auch eine ausgedehnte Google-Suche lieferte kein Ergebnis.

Ich würde mich sehr freuen, wenn jemand dazu eine Lösung hätte.. 



Liebe Grüße

youpwnT


----------



## Spacerat (24. Mai 2012)

Die "values()"-Methode ist rein zufällig statisch. Das bedeutet, du bekommst ein Array aller Enum-Entrys dieser Klasse. Enums haben bis auf ihr Ordinal eigentlich gar keinen Wert, sondern stellen lediglich eine typsichere alternative zu switch mit int dar. Wenn Enums irgendwelche Werte bekommen sollen musst du sie anders instanzieren... z.B.

```
public enum Vocabular {
  DOG("Hund"),
  CAT("Katze"), //...
  ;

  private final String germanText;

  Vocabular(String text) {
    germanText = text;
  }

  public String toGerman() {
    return germanText;
  }
}
```
Willst du aber blos den Namen der Instanz genügt ein simples "toString()", sicherer ist hier aber "name()", weil diese Methode nicht überschrieben werden kann.


----------



## Kevin94 (24. Mai 2012)

Das Problem, dass er hat, ist dass im gegensatz zu valueOf Methode values() nicht in Enum definiert ist, sondern vom Kompiler automatisch hinzugefügt wird. Das ganze lässt sich nur mit Reflections lösen:

```
public T[] <T> values(String nameDesEnums) throws Exception
{
Class c=Class.forName(nameDesEnums);
Method m=c.getMethod("values");
return (T[]) m.invoke(null);
}
```


----------



## youpwnT (25. Mai 2012)

Vielen Dank für die Antworten!

Ich glaube aber, dass ich falsch verstanden wurde.

Angenommen ich habe ein enum mit Namen *Peter* im Paket paket1, dann funktioniert folgender Code:

```
String string = paket1.Peter.values()[1].toString();
```
Ich benötige den Code aber in folgender Form:

```
String name = "Peter";
String string = paket1.name.values()[1].toString();
```
Und das funktioniert nicht.

Liebe Grüße

youpwnT


----------



## SlaterB (25. Mai 2012)

Peter p = Peter.valueOf(name);

edit:
ach ne, Peter ist der Klassenname, gleich

edit:
Class.forName(name).getEnumConstants()[..] // bei name package ergänzen


----------

