java的枚举常常被用来替代常量值,每个枚举值代表一个特定的常数。
在反序列化时有常常需要用到常数到枚举的转换,这就涉及到枚举的反向查找。
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原则,重复代码地方一般都有一定的坏味道。
查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/Java/
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索string
, private
, des
, java ocket 反向
, value
, defaultvalue
, order
, java 枚举
, java枚举
java枚举的使用
java 反向dns查找、java string 反向查找、java 反向查找、java 枚举、java枚举类型的用法,以便于您获取更多的相关知识。