KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com4j > EnumDictionary


1 package com4j;
2
3 import java.util.Collections JavaDoc;
4 import java.util.HashMap JavaDoc;
5 import java.util.Map JavaDoc;
6 import java.util.WeakHashMap JavaDoc;
7
8 /**
9  * Provides faster number <-> enum conversion.
10  *
11  * @author Kohsuke Kawaguchi (kk@kohsuke.org)
12  */

13 abstract class EnumDictionary<T extends Enum JavaDoc<T>> {
14     protected final Class JavaDoc<T> clazz;
15
16
17     private EnumDictionary(Class JavaDoc<T> clazz) {
18         this.clazz = clazz;
19         assert clazz.isEnum();
20     }
21
22     /**
23      * Looks up a dictionary from an enum class.
24      */

25     public static <T extends Enum JavaDoc<T>>
26     EnumDictionary<T> get( Class JavaDoc<T> clazz ) {
27         EnumDictionary<T> dic = (EnumDictionary<T>)registry.get(clazz);
28         if(dic==null) {
29             boolean sparse = ComEnum.class.isAssignableFrom(clazz);
30             if(sparse)
31                 dic = new Sparse<T>(clazz);
32             else
33                 dic = new Continuous<T>(clazz);
34             registry.put(clazz,dic);
35         }
36         return dic;
37     }
38
39     /**
40      * Gets the integer value for the given enum constant.
41      */

42     abstract int value( Enum JavaDoc t );
43     /**
44      * Gets the enum constant object from its integer value.
45      */

46     abstract T constant( int v );
47
48
49     /**
50      * For enum constants that doesn't use any {@link ComEnum}.
51      */

52     static class Continuous<T extends Enum JavaDoc<T>> extends EnumDictionary<T> {
53         private T[] consts;
54
55         private Continuous(Class JavaDoc<T> clazz) {
56             super(clazz);
57             consts = clazz.getEnumConstants();
58         }
59
60         public int value( Enum JavaDoc t ) {
61             return t.ordinal();
62         }
63
64         public T constant( int v ) {
65             return consts[v];
66         }
67     }
68
69     /**
70      * For enum constants with {@link ComEnum}.
71      */

72     static class Sparse<T extends Enum JavaDoc<T>> extends EnumDictionary<T> {
73         private final Map JavaDoc<Integer JavaDoc,T> fromValue = new HashMap JavaDoc<Integer JavaDoc,T>();
74
75         private Sparse(Class JavaDoc<T> clazz) {
76             super(clazz);
77
78             T[] consts = clazz.getEnumConstants();
79             for( T v : consts ) {
80                 fromValue.put(((ComEnum)v).comEnumValue(),v);
81             }
82         }
83
84         public int value( Enum JavaDoc t ) {
85             return ((ComEnum)t).comEnumValue();
86         }
87
88         public T constant( int v ) {
89             T t = fromValue.get(v);
90             if(t==null)
91                 throw new IllegalArgumentException JavaDoc(clazz.getName()+" has no constant of the value "+v);
92             return t;
93         }
94     }
95
96
97     private static final Map JavaDoc<Class JavaDoc<? extends Enum JavaDoc>,EnumDictionary> registry =
98         Collections.synchronizedMap(new WeakHashMap JavaDoc<Class JavaDoc<? extends Enum JavaDoc>,EnumDictionary>());
99 }
100
Popular Tags