Ich habe in einem Blog gesehen, dass das Folgende eine vernünftige Möglichkeit ist, eine "Reverse-Lookup" mit der getCode(int)
in einer Java-Enumeration durchzuführen:
public enum Status {
WAITING(0),
READY(1),
SKIPPED(-1),
COMPLETED(5);
private static final Map<Integer,Status> lookup
= new HashMap<Integer,Status>();
static {
for(Status s : EnumSet.allOf(Status.class))
lookup.put(s.getCode(), s);
}
private int code;
private Status(int code) {
this.code = code;
}
public int getCode() { return code; }
public static Status get(int code) {
return lookup.get(code);
}
}
Für mich sehen sowohl die statische Karte als auch der statische Initialisierer wie eine schlechte Idee aus, und mein erster Gedanke wäre, die Suche so zu codieren:
public enum Status {
WAITING(0),
READY(1),
SKIPPED(-1),
COMPLETED(5);
private int code;
private Status(int code) {
this.code = code;
}
public int getCode() { return code; }
public static Status get(int code) {
for(Status s : values()) {
if(s.code == code) return s;
}
return null;
}
}
Gibt es offensichtliche Probleme mit beiden Methoden und gibt es eine empfohlene Möglichkeit, diese Art der Suche zu implementieren?
for(Status s : values()) lookup.put(s.code, s);