JAVA中枚举(Enum)的系列文章 - 反向查找、总结

转自: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 代码切换常量的地方。如果只有单独一个值(例如,鞋的最大尺寸,或者笼子中能装猴子的最大数目),则还是把这个任务留给常量吧。但是,如果定义了一组值,而这些值中的任何一个都可以用于特定的数据类型,那么将枚举用在这个地方最适合不过。

你可能感兴趣的:(java基础)