Java枚举反向查找最佳实践

标签 java enums static-initializer

我看到了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/

相关文章:

java - 代理存储库 VS 托管存储库

java - 如何获取在类中声明为映射的常量

f# - 在 F# 中将字节转换为枚举的实例

c++ - 从两个枚举类创建复合类型,为 STL 映射做好准备

Java 类加载器问题或并发错误?

Java SWT : How to trigger ModifyListener through source code?

Java 分割整数链表

java - Java静态初始化器线程安全吗?

c++ - 请求 "Static Initialization Order Fiasco"的详细描述

java - 如何使用 Quarkus-Gradle-Plugin 构建 uberJar