使用其值获取枚举常量

时间:2017-01-04 12:09:57

标签: java enums kotlin

我试图使用其值来获取枚举,但它会引发错误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标志

2 个答案:

答案 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" }
}