【发布时间】:2011-07-16 00:53:14
【问题描述】:
我看到suggested on a blog 认为以下是在 Java 枚举中使用 getCode(int) 进行“反向查找”的合理方法:
public enum Status {
WAITING(0),
READY(1),
SKIPPED(-1),
COMPLETED(5);
private static final Map<Integer,Status> lookup
= new HashMap<Integer,Status>();
static {
for(Status s : EnumSet.allOf(Status.class))
lookup.put(s.getCode(), s);
}
private int code;
private Status(int code) {
this.code = code;
}
public int getCode() { return code; }
public static Status get(int code) {
return lookup.get(code);
}
}
对我来说,静态映射和静态初始化器看起来都是个坏主意,我的第一个想法是将查找编码如下:
public enum Status {
WAITING(0),
READY(1),
SKIPPED(-1),
COMPLETED(5);
private int code;
private Status(int code) {
this.code = code;
}
public int getCode() { return code; }
public static Status get(int code) {
for(Status s : values()) {
if(s.code == code) return s;
}
return null;
}
}
这两种方法有什么明显的问题吗?有没有推荐的方法来实现这种查找?
【问题讨论】:
-
顺便说一句,对你来说地图构建循环你可以完成
for(Status s : values()) lookup.put(s.code, s); -
使用
Enum.valueOf()有什么问题吗?您无法存储字符串吗? -
@Jonathan 您经常需要从二进制或数字输入中生成枚举。所以我想
Enum.valueOf()没有什么错(尽管要注意大写),但通常你只是从一个字节或一个数字开始。并且请:如果不需要字符串,请忽略它,如果您想知道原因,请查找“字符串类型的编码恐怖”。基本上你应该不断地问自己:当我收到一个字符串时,我知道里面是什么吗?它包含比整数更多的状态,或者实际上是一个枚举,并且状态增加是不好的。
标签: java enums static-initializer