转自:http://www.sinojava.com/bbs/redirect.php?tid=1316&goto=lastpost
JAVA中枚举(Enum)的系列文章 - 反向查找、总结
在就是一个类一文中说到枚举也可以自定义构造函数,可以用属性来关联更多的数据。那如果我们有这样的一种需要该怎么办呢?——我们需要根据关联的数据来得到相应的枚举项,例如下面的这种情况:
复制内容到剪贴板代码:
public final enum Status { WAITING(0), READY(1), SKIPPED(-1), COMPLETED(5); private int code; private Status(int code) { this.code = code; } public int getCode() { class="t_tag">return code; }}这里每种Status对应了一个code,WAITING对应了0,而COMPLETED对应了5。如果想通过0得到WAITING这个枚举项要怎么做?
做法也很简单,使用一个静态的java.util.Map来把code和枚举项关联起来就可以了,就像这样:
复制内容到剪贴板代码:
import java.util.EnumSet;import java.util.HashMap;import java.util.Map;enum Status {WAITING(0),READY(1),SKIPPED(-1),COMPLETED(5);private static final Map lookup = new HashMap();static {for (Status s : EnumSet.allOf(Status.class)) {lookup.put(s.getCode(), s);}}public static Status get(int code) {return lookup.get(code);}private int code;private Status(int code) {this.code = code;}public int getCode() {return code;}}静态方法get(int)提供了需求中的反向查找能力,而静态块里使用EnumSet来把起映射做用的Map组装起来,Over!
总结:使用枚举,但不要滥用!
学习任何新版语言的一个危险就是疯狂使用新的语法结构。如果这样做,那么您的代码就会突然之间有 80% 是泛型、标注和枚举。所以,应当只在适合使用枚举的地方才使用它。那么,枚举在什么地方适用呢?一条普遍规则是,任何使用常量的地方,例如目前用 switch 代码切换常量的地方。如果只有单独一个值(例如,鞋的最大尺寸,或者笼子中能装猴子的最大数目),则还是把这个任务留给常量吧。但是,如果定义了一组值,而这些值中的任何一个都可以用于特定的数据类型,那么将枚举用在这个地方最适合不过。