我看到了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;
}
}
这两种方法是否有任何明显的问题,是否有推荐的方法来实现这种查找?
最佳答案
Maps.uniqueIndex来自 Google 的 Guava对于构建查找 map 非常方便。
更新:以下是在 Java 8 中使用 Maps.uniqueIndex
的示例:
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枚举反向查找最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57273208/