使用其值获取枚举常量

Sai*_*Sai 4 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))
}
Run Code Online (Sandbox Code Playgroud)

日志:

线程"main"中的异常java.lang.IllegalArgumentException:没有枚举常量TaskAction.Un标志

mar*_*ran 8

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)

  • @SaiKiran 请参阅编辑。 (2认同)

Sai*_*Sai 5

我将枚举类更改为如下所示,添加了静态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)

  • 1.“ fromValue”可能比“ getFromValue”更好。2.`lookup`可以简单地初始化为`private val lookup = values()。associateBy(TaskAction :: value)`。3.您可能想抛出`IllegalArgumentException`而不是`KotlinNullPointerException`。例如`return requireNotNull(lookup [value]){“没有TaskAction的值为$ value”}`。 (2认同)