Java 枚举反向查找最佳实践 [英] Java enum reverse look-up best practice
问题描述
我在博客上看到了建议以下是在 Java 枚举中使用 getCode(int)
进行反向查找"的合理方法:
I saw it suggested on a blog that the following was a reasonable way to do a "reverse-lookup" using the getCode(int)
in a Java enum:
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);
}
}
对我来说,静态映射和静态初始化器看起来都是个坏主意,我的第一个想法是将查找编码为:
To me, the static map and the static initializer both look like a bad idea, and my first thought would be to code the lookup as so:
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;
}
}
这两种方法是否有任何明显的问题,是否有推荐的方法来实现这种查找?
Are there any obvious problems with either method, and is there a recommended way to implement this kind of lookup?
推荐答案
Maps.uniqueIndex 来自 Google 的 Guava 对于构建查找地图非常方便.
Maps.uniqueIndex from Google's Guava is quite handy for building lookup maps.
更新:下面是一个在 Java 8 中使用 Maps.uniqueIndex
的例子:
Update: Here is an example using Maps.uniqueIndex
with Java 8:
public enum MyEnum {
A(0), B(1), C(2);
private static final Map<Integer, MyEnum> LOOKUP = Maps.uniqueIndex(
Arrays.asList(MyEnum.values()),
MyEnum::getStatus
);
private final int status;
MyEnum(int status) {
this.status = status;
}
public int getStatus() {
return status;
}
@Nullable
public static MyEnum fromStatus(int status) {
return LOOKUP.get(status);
}
}
这篇关于Java 枚举反向查找最佳实践的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!