generics & enums

J

josef

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();
}
}
 
R

Roland de Ruiter

On 14-8-2006 20:57, josef wrote:
[...]
/*
* 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)
*
*/
[...]


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));
}
}
}
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
474,262
Messages
2,571,049
Members
48,769
Latest member
Clifft

Latest Threads

Top