Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsWhite Papers
Discussion GroupsFirst AidDatabasesJavaBeansGUIJava 3DVirtual MachineCORBASecurityToolsGeneral
Java DirectoryOpen Source ProjectsSample Book ChaptersUser GroupsWeb Resources
Related Topics
Databases.NETMore Topics ...

Java Forum / General / August 2006

Tip: Looking for answers? Try searching our database.

generics & enums

Thread view: 
josef - 14 Aug 2006 19:57 GMT
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



Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.