Hi,
gegeben folgendes Enum:
Ich habe noch eine Reihe weitere solcher Enums, alle mit einem byId(int id). Die Methode sieht immer gleich aus und es wäre toll, sie in eine Basisklasse auszulagern. Aber enums können nur Interfaces implementieren. Mein Versuch ein Interface mit getId() zu machen und eine statische Hilfsmethode zu schreiben scheitert daran, dass ich dann auf values nicht zugreifen kann.
Eine Lösung per Reflection geht:
Aber geht das auch ohne diesen Umweg und eventuell als Instanzmethode von den Enums?
gegeben folgendes Enum:
Java:
public enum Product {
client(1), server(2);
private Product(int i) {
id = i;
}
private int id;
public int getId() {
return id;
}
public static Product byId(int id) {
for (Product p: values()) {
if (p.getId() == id) {
return p;
}
}
throw new IllegalArgumentException("unknown id");
}
}
Ich habe noch eine Reihe weitere solcher Enums, alle mit einem byId(int id). Die Methode sieht immer gleich aus und es wäre toll, sie in eine Basisklasse auszulagern. Aber enums können nur Interfaces implementieren. Mein Versuch ein Interface mit getId() zu machen und eine statische Hilfsmethode zu schreiben scheitert daran, dass ich dann auf values nicht zugreifen kann.
Eine Lösung per Reflection geht:
Java:
@SuppressWarnings("unchecked")
private static <T> T getById(Class<T> t, int id) {
try {
Method values = t.getMethod("values");
Method getId = t.getMethod("getId");
for (T x: (T[])values.invoke(null)) {
if (((Integer)getId.invoke(x)) == id) {
return x;
}
}
throw new IllegalArgumentException();
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}
Aber geht das auch ohne diesen Umweg und eventuell als Instanzmethode von den Enums?