获取枚举常量使用其值
我试图让枚举使用它的值,但它会抛出一个错误,说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)) }
日志:
线程“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 } }
我改变了我的枚举类如下所示,我添加了一个静态的地图。 因为它没有办法将价值和名字本身映射。 我认为这可能会有所帮助。
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" } }