3

在枚举中 values() 方法如何工作?

values() 方法背后的逻辑是什么?

在我的项目中,我们将所有枚举数据缓存在 Map 中,如下所示:

public enum Actions {
CREATE("create"),
UPDATE("update"),
DELETE("delete"),
ACTIVE("active"),
INACTIVE("inactive"),
MANAGE_ORDER("manage"),
;


private static Map<String, Actions> actionMap;
static {
    actionMap = new HashMap<String, Actions>(values().length);
    for(Actions action : values()) {
        actionMap.put(action.getName(), action);
    }
}

public static Actions fromName(String name) {
    if(name == null) 
        throw new IllegalArgumentException();
    return actionMap.get(name);
}
private String name;

private Actions(String name) {
    this.name = name;
}

public String getName() {
    return name;
}

}

这是使用 enum 的最佳做法吗?

4

2 回答 2

7

在枚举中 values() 方法如何工作?

阅读Oracle 教程

枚举声明定义了一个类(称为枚举类型)。枚举类主体可以包括方法和其他字段。编译器在创建枚举时会自动添加一些特殊方法。例如,它们有一个静态值方法,该方法返回一个数组,该数组按照声明的顺序包含枚举的所有值。此方法通常与 for-each 构造结合使用,以迭代枚举类型的值。

还有一点需要注意的是,如果你使用 enum 作为键,最好使用EnumMap

用于枚举类型键的专用 Map 实现。枚举映射中的所有键都必须来自创建映射时显式或隐式指定的单个枚举类型。枚举映射在内部表示为数组。这种表示非常紧凑和高效。

于 2013-07-30T14:15:22.967 回答
2

不是很好的练习。除了MANAGE_ORDER,你可以用这个替换所有的废话:

public static Action fromName(String name) {
    try {
        return valueOf(name.toUpperCase());
    } catch (IllegalArgumentException e) {
        return null;
    } 
}

此外,命名您的字段name是一个糟糕的选择,因为所有枚举都隐含:

public String name();

它将枚举常量名称作为字符串返回。

于 2013-07-30T14:18:59.893 回答