Java枚举的反向查找2014-08-26 博客园 DoubleTenjava的枚举常常被用来替代常量值,每个枚举值代表一个特定的常数。在反序列化时有常常需要用到常数到枚举的转换,这就涉及到枚举的反向查找。1、从枚举名反向查找枚举这种方法是最先使用也最为简便的可以用到枚举的静态方法valueOf(String name)valueOf方法为内置方法,使用简便,但在查找不到枚举时会抛出异常。熟悉异常的同学可能知道异常抛出时,需要收集虚拟机的调用堆栈上下文信息,对性能影响较大。使用时,常常需要使用这么一个反序列化查找方法E find(String name, E defaultValue),在查找不到时能够返回一个默认值而不是抛出异常2、从枚举值所包含的描述值反向查找枚举例如这种枚举定义
public enum SomeEnum{A("ADes", 1),B("BDes", 2),unknown("UNKNWONDes", 3); private string des;private int order; private SomeEnum(string des, int order){this.des = des;this.order = order;}}此时可以在枚举类中增加一个HashMap,并在类加载时初始化好。
public enum SomeEnum{A("ADes"),B("BDes"),unknown("UNKNWONDes"); private string des; private static final map lookup = new hashmap(); static {for(SomeEnum e : EnumSet.allOf(SomeEnum.class)){lookup.put(e.des, e);}} private SomeEnum(string des){this.des = des;} public static SomeEnum find(string des, SomeEnum defaultValue){SomeEnum value = lookup.get(des);if(value == null){return defaultValue;}return value;}}3、进一步,如果枚举中有多个描述值,并且描述值类型不一样这时初始化代码和查找代码需要写多遍。
public enum SomeEnum{A("ADes", 1),B("BDes", 2),unknown("UNKNWONDes", 3); private string des;private int order; private static final map lookup = new hashmap(); private static final map lookup_int = new hashmap(); static {for(SomeEnum e : EnumSet.allOf(SomeEnum.class)){lookup.put(e.des, e);lookup_int.put(e.order, e);}} private SomeEnum(string des, int order){this.des = des;this.order = order;} public static SomeEnum find(string des, SomeEnum defaultValue){SomeEnum value = lookup.get(des);if(value == null){return defaultValue;}return value;} public static SomeEnum find(int order, SomeEnum defaultValue){SomeEnum value = lookup_int.get(order);if(value == null){return defaultValue;}return value;}}不少代码有重复,枚举类需要自己实现反向查找映射关系在HashMap中的初始化。根据DRY原则,重复代码地方一般都有一定的坏味道。