我试图使用其值来获取枚举,但它会引发错误No enum constant
。例如代码在Kotlin中,但它在Java中是相同的,提前感谢。
import java.util.*
enum class TaskAction constructor(val value: String) {
ARCHIVE("Archive"), UN_FLAG("Un flag"), FLAG("Flag"), REDO("Redo"),
READY("Ready"), EDIT("Edit"), DND("dnd"), DELETE("Delete"),
IN_PROGRESS("In progress"), DONE("Done");
}
fun main(args: Array<String>) {
showSomeThing(TaskAction.UN_FLAG.value)
}
fun showSomeThing(enum: String) {
println(TaskAction.valueOf(enum))
}
日志:
线程中的异常&#34; main&#34; java.lang.IllegalArgumentException:没有枚举 常量TaskAction.Un标志
答案 0 :(得分:8)
valueOf
方法接受一个字符串,该字符串应与枚举常量的 name 对应。但是,您提取枚举的值并尝试将其映射回常量。除非值等于常量的名称,否则这不起作用。
所以你的问题是TaskAction.UN_FLAG.value
返回"Un flag"
。然后你调用TaskAction.valueOf("Un flag")
,它找不到你提供的字符串的任何枚举常量(因为枚举常量的名称是UN_FLAG
)。
所以基本上:"Un flag" != "UN_FLAG"
编辑:
要解决这个问题,我会创建一个函数,根据该值找到正确的枚举。我会将该函数放在TaskAction
的伴随对象中。像这样:
companion object {
fun from(s: String): TaskAction? = values().find { it.value == s }
}
答案 1 :(得分:4)
我将我的枚举类更改为类似下面的内容,我添加了静态地图。因为它无法单独映射值和名称。我认为这可能有所帮助。
enum class TaskAction constructor(val value: String) {
ARCHIVE("Archive"), UN_FLAG("Un flag"), FLAG("Flag"), REDO("Redo"),
READY("Ready"), EDIT("Edit"), DND("dnd"), DELETE("Delete"),
IN_PROGRESS("In progress"), DONE("Done");
companion object {
private val lookup = HashMap<String, TaskAction>()
init {
TaskAction.values().map { lookup.put(it.value, it) }
}
fun getFromValue(value: String):TaskAction {
return lookup[value]!!
}
}
}
更新
感谢@ mfulton26我简化了我的代码:
enum class TaskAction constructor(val value: String) {
ARCHIVE("Archive"), UN_FLAG("Un flag"), FLAG("Flag"), REDO("Redo"),
READY("Ready"), EDIT("Edit"), DND("dnd"), DELETE("Delete"),
IN_PROGRESS("In progress"), DONE("Done");
companion object {
private val lookup = values().associateBy(TaskAction::value)
fun fromValue(value: String):TaskAction = requireNotNull(lookup[value]) { "No TaskAction with value $value" }
}
}
我甚至在@marstran的帮助下减少了代码:
companion object {
fun from(search: String): TaskAction = requireNotNull(values().find { it.value == search }) { "No TaskAction with value $search" }
}