1 package com4j; 2 3 import java.util.Collections ; 4 import java.util.HashMap ; 5 import java.util.Map ; 6 import java.util.WeakHashMap ; 7 8 13 abstract class EnumDictionary<T extends Enum <T>> { 14 protected final Class <T> clazz; 15 16 17 private EnumDictionary(Class <T> clazz) { 18 this.clazz = clazz; 19 assert clazz.isEnum(); 20 } 21 22 25 public static <T extends Enum <T>> 26 EnumDictionary<T> get( Class <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 42 abstract int value( Enum t ); 43 46 abstract T constant( int v ); 47 48 49 52 static class Continuous<T extends Enum <T>> extends EnumDictionary<T> { 53 private T[] consts; 54 55 private Continuous(Class <T> clazz) { 56 super(clazz); 57 consts = clazz.getEnumConstants(); 58 } 59 60 public int value( Enum t ) { 61 return t.ordinal(); 62 } 63 64 public T constant( int v ) { 65 return consts[v]; 66 } 67 } 68 69 72 static class Sparse<T extends Enum <T>> extends EnumDictionary<T> { 73 private final Map <Integer ,T> fromValue = new HashMap <Integer ,T>(); 74 75 private Sparse(Class <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 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 (clazz.getName()+" has no constant of the value "+v); 92 return t; 93 } 94 } 95 96 97 private static final Map <Class <? extends Enum >,EnumDictionary> registry = 98 Collections.synchronizedMap(new WeakHashMap <Class <? extends Enum >,EnumDictionary>()); 99 } 100 | Popular Tags |