值方法如何在枚举中工作

时间:2013-07-30 14:12:41

标签: java

在Enum中,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;
}

}

这是使用枚举的最佳做法吗?

2 个答案:

答案 0 :(得分:7)

  

在Enum中,values()方法如何工作?

阅读Oracle tutorial

  

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

另外需要注意的是,如果您使用枚举作为键,最好使用EnumMap

  

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

答案 1 :(得分:2)

不是很好的练习。除MANAGE_ORDER之外,您可以用以下内容替换所有废话:

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

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

public String name();

将枚举常量名称作为String返回。