我试图使用它的值获得枚举,但它会抛出一个错误说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))
}
Run Code Online (Sandbox Code Playgroud)
日志:
线程"main"中的异常java.lang.IllegalArgumentException:没有枚举常量TaskAction.Un标志
该valueOf方法采用一个字符串,该字符串应与枚举常量的名称相对应.但是,您提取枚举的值并尝试将其映射回常量.除非值等于常量的名称,否则这不起作用.
所以你的问题是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 }
}
Run Code Online (Sandbox Code Playgroud)
我将枚举类更改为如下所示,添加了静态Map。因为它不可能自己映射值和名称。我认为这可能会有所帮助。
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]!!
}
}
}
Run Code Online (Sandbox Code Playgroud)
更新:
感谢@ 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" }
}
}
Run Code Online (Sandbox Code Playgroud)
我什至在@marstran的帮助下简化了代码:
companion object {
fun from(search: String): TaskAction = requireNotNull(values().find { it.value == search }) { "No TaskAction with value $search" }
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3757 次 |
| 最近记录: |