这个问题基本上是我previous question的扩展。我问上一个问题,确保在加载类时填充Enum常量。这是我的课程,再加上一个简单的方法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");
}
关于我在这里做错了什么想法?
答案 0 :(得分:64)
Enum.valueOf()
仅检查常量名称,因此您需要将其传递给"COLUMN_HEADINGS"
而不是“columnHeadings”。您的name
属性与Enum内部无关。
解决评论中的问题/疑虑:
枚举的“内置”(隐式声明)valueOf(String name)
方法将查找具有该确切名称的枚举常量。如果您的输入是“columnHeadings”,则您(至少)有三个选择:
enum PropName { contents, columnHeadings, ...}
。这显然是最方便的。valueOf
之前将您的camelCase输入转换为UPPER_SNAKE_CASE。valueOf
,以查找输入的相应常量。如果同一组常量存在多个可能的映射,则这是最有意义的。答案 1 :(得分:9)
这是因为您为枚举定义了自己的name
版本,getByName
不使用该版本。
getByName("COLUMN_HEADINGS")
可能会奏效。
答案 2 :(得分:2)
而不是定义:COLUMN_HEADINGS("columnHeadings")
尝试将其定义为:COLUMNHEADINGS("columnHeadings")
然后当您致电getByName(String name) method
时,请使用上面的字符串调用它,如下所示:getByName(myStringVariable.toUpperCase())
我和你有同样的问题,这对我有用。
答案 3 :(得分:0)
当我尝试传递从后端获取的可空枚举时,我遇到了解析枚举问题。 当然,当我们获得价值时,它就起作用了,但是当空值出现时,这是一个问题。
java.lang.IllegalArgumentException:没有枚举常量
另外的问题是,当我们在Parcelize读取时写一些 short if 。
为此,我的解决方案是
1。使用解析方法创建伴随对象。
enum class CarsType {
@Json(name = "SMALL")
SMALL,
@Json(name = "BIG")
BIG;
companion object {
fun nullableValueOf(name: String?) = when (name) {
null -> null
else -> valueOf(name)
}
}
}
2。在Parcerable读取的地方像这样使用它
data class CarData(
val carId: String? = null,
val carType: CarsType?,
val data: String?
) : Parcelable {
constructor(parcel: Parcel) : this(
parcel.readString(),
CarsType.nullableValueOf(parcel.readString()),
parcel.readString())