Java中的枚举循环

Boh*_*ohn 0 java enums

我有一些像这样的枚举:

public enum Classification {
    UNKNOWN("Unknown"),
    DELETION("Deletion"),
    DUPLICATION("Duplication"), ....
Run Code Online (Sandbox Code Playgroud)

但是其中一些人有20个成员,所以目前我在代码中用巨大的if/else块处理它们,如下所示:

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

(rs来自JDBC tho).

Java是否有更好的方法来处理这些大的if/else块来做我正在做的事情?通过它循环的一些排序?

Bal*_*usC 10

您可以使用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);
}
Run Code Online (Sandbox Code Playgroud)

并按如下方式使用它

Classification classification = Classification.of(rs.getInt("classification"));
// ...
Run Code Online (Sandbox Code Playgroud)

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

UNKNOWN(1, "Unknown"),
DELETION(2, "Deletion"),
DUPLICATION(3, "Duplication"),
// ...
Run Code Online (Sandbox Code Playgroud)

然后使用该值代替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);
}
Run Code Online (Sandbox Code Playgroud)