获取枚举常量使用其值

我试图让枚举使用它的值,但它会抛出一个错误,说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" } }