这个问题基本上是我的延伸上一个问题 https://stackoverflow.com/questions/12639038/when-do-enum-instances-get-created。我问上一个问题是为了确保在类加载时填充枚举常量。这是我的课程,添加了一个简单的方法getByName
:
public enum PropName {
CONTENTS("contents"),
USE_QUOTES("useQuotes"),
ONKEYDOWN("onkeydown"),
BROWSER_ENTIRE_TABLE("browseEntireTable"),
COLUMN_HEADINGS("columnHeadings"),
PAGE_SIZE("pageSize"),
POPUP_TITLE("popupTitle"),
FILTER_COL("filterCol"),
SQL_SELECT("sqlSelect"),
;
private String name;
private PropName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public static PropName getByName(String name){
return PropName.valueOf(name);
}
}
对该方法的调用getByName("columnHeadings")
正在投掷java.lang.IllegalArgumentException: No enum const class labware.web.component.limsgrid.PropName.columnHeadings
但如果我用下面的代码替换这个方法,它就可以工作。
public static PropName getByName(String name){
for(PropName prop : values()){
if(prop.getName().equals(name)){
return prop;
}
}
throw new IllegalArgumentException(name + " is not a valid PropName");
}
关于我在这里做错了什么有什么想法吗?
Enum.valueOf()
只检查常量名称,因此需要传递它"COLUMN_HEADINGS"
而不是“列标题”。你的name
属性与 Enum 内部无关。
为了解决评论中的问题/疑虑:
枚举的“内置”(隐式声明)valueOf(String name)
方法将查找具有该确切名称的枚举常量。如果您的输入是“columnHeadings”,您(至少)有三个选择:
- 暂时忘记命名约定,只用最有意义的方式命名常量:
enum PropName { contents, columnHeadings, ...}
。这显然是最方便的。
- 在调用之前将您的驼峰式输入转换为 UPPER_SNAKE_CASE
valueOf
,如果您真的喜欢命名约定。
- 实现您自己的查找方法而不是内置的
valueOf
找到输入对应的常量。如果同一组常量有多个可能的映射,则这是最有意义的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)