class A<T extends Enum<T>> {
Class<T> e;
public A(Class<T> type) {
e = type;
}
public T get(int ordinal) {
/*
* Is there a better (faster) way to access the implicitly declared
* static method 'values' (1) for enums (i.e. without reflection)?
*
* (I'm trying to implement a sweet ComboboxModel)
*
* (1)
http://java.sun.com/docs/books/jls/third_edition/html/classes.html#302265
*/
try {
return ((T[])e
.getDeclaredMethod("values", new Class[]{})
.invoke(null, new Class[]{}))[ordinal];
} catch(Exception ex) {
//method is static and defined in java language specification
}
throw new AssertionError();
}
}
Roland de Ruiter - 14 Aug 2006 21:58 GMT
[...]
> /*
> * Is there a better (faster) way to access the implicitly declared
[quoted text clipped - 3 lines]
> *
> */
[...]
Use Class#getEnumConstants()
<http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Class.html#getEnumConstants()>
Looking at the source code of this method, however, it appears to use
reflection as well, though it caches it's values (so a subsequent calls
of getEnumConstants() return the cached values).
You could apply the same technique. The following example caches the
enum constants immediately in the constructor:
public class A<E extends Enum<E>> {
private final E[] enumConstants;
public A(Class<E> enumType) {
enumConstants = enumType.getEnumConstants();
}
public E get(int ordinal) {
if (ordinal >= 0 && ordinal < size()) {
return enumConstants[ordinal];
} else {
return null;
// OR:
// throw new
IndexOutOfBoundsException(String.valueOf(ordinal));
}
}
public int size() {
return enumConstants.length;
}
public static void main(String[] args) {
A<Thread.State> a = new A<Thread.State>(Thread.State.class);
for (int i = -1; i <= a.size(); i++) {
System.out.println("A.get(" + i + ")=" + a.get(i));
}
}
}

Signature
Regards,
Roland