Das verwende ich. Ich behaupte nicht, dass es weit weniger "effizient" ist als die oben genannten einfacheren Lösungen. Was es tut, ist eine viel klarere Ausnahmemeldung als "ArrayIndexOutOfBounds", wenn ein ungültiger Ordinalwert in der obigen Lösung verwendet wird.
Es nutzt die Tatsache, dass EnumSet javadoc spezifiziert der Iterator gibt Elemente in ihrer natürlichen Reihenfolge. Es gibt eine Assert, wenn das nicht korrekt ist.
Der JUnit4-Test zeigt, wie er verwendet wird.
/**
* convert ordinal to Enum
* @param clzz may not be null
* @param ordinal
* @return e with e.ordinal( ) == ordinal
* @throws IllegalArgumentException if ordinal out of range
*/
public static <E extends Enum<E> > E lookupEnum(Class<E> clzz, int ordinal) {
EnumSet<E> set = EnumSet.allOf(clzz);
if (ordinal < set.size()) {
Iterator<E> iter = set.iterator();
for (int i = 0; i < ordinal; i++) {
iter.next();
}
E rval = iter.next();
assert(rval.ordinal() == ordinal);
return rval;
}
throw new IllegalArgumentException("Invalid value " + ordinal + " for " + clzz.getName( ) + ", must be < " + set.size());
}
@Test
public void lookupTest( ) {
java.util.concurrent.TimeUnit tu = lookupEnum(TimeUnit.class, 3);
System.out.println(tu);
}