java - Java 中的枚举循环

标签 java enums

我有一些像这样的枚举:

public enum Classification {
    UNKNOWN("Unknown"),
    DELETION("Deletion"),
    DUPLICATION("Duplication"), ....

但其中一些有大约 20 个成员,因此目前在代码中我使用巨大的 if/else block 来处理它们,如下所示:

int classification= rs.getInt("classification");
        if (classification == Classification.UNKNOWN.ordinal()) {
            variant.setClassification(Classification.UNKNOWN);
        } else if (classification == Classification.DELETION.ordinal()) {
            variant.setClassification(Classification.DELETION);

(rs 来自 JDBC)。

Java 有没有更好的方法让这些大的 if/else block 来完成我正在做的事情?某种循环遍历它的排序?

最佳答案

您可以使用Enum#values()来获取数组中的所有枚举值。序号将 1:1 映射到数组索引。为您的 Classification 枚举添加以下方法:

public static Classification of(int ordinal) {
    if (0 <= ordinal && ordinal < values().length) {
        return values()[ordinal];
    }
    throw new IllegalArgumentException("Invalid ordinal " + ordinal);
}

并按如下方式使用

Classification classification = Classification.of(rs.getInt("classification"));
// ...

但是,为此使用枚举的序数并不是最佳实践。如果某些开发人员重新排列枚举的值或添加/删除值怎么办?甚至是javadoc警告说它通常对开发人员没有用处。而是给每个枚举值一个固定的标识符。您可以将其作为枚举构造函数参数的附加参数传递。您甚至可以使用枚举的 String 表示形式。

UNKNOWN(1, "Unknown"),
DELETION(2, "Deletion"),
DUPLICATION(3, "Duplication"),
// ...

然后将该值用于 DB,并修改 of() 方法以在 foreach 循环中遍历它们:

public static Classification of(int id) {
    for (Classification classification : values()) {
        if (classification.id == id) {
            return classification;
        }
    }
    throw new IllegalArgumentException("Invalid id " + id);
}

关于java - Java 中的枚举循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7193510/

相关文章:

java - 带有 mvn devserver 的 Google App Engine Java 失败 : missing "guestbook/target/guestbook-1.0-SNAPSHOT"

java科学记数法e和e+?

c# - 在 C# 中的方法中定义枚举?

java - 单独的枚举文件不接受变量

java - Oracle SQL 查询不带所有参数

java - 如何在使用 bash 脚本初始化的 java 应用程序中捕获信号

Java套接字 - 客户端不从服务器的套接字读取字符串

MySQL 查询性能困境 : enum vs tables

c# - 如何将枚举数组放入授权属性中?

java - 这会造成内存泄漏吗?