Kotlin是否允许您将自定义值分配给枚举?

时间:2019-02-28 01:47:34

标签: kotlin enums

这将引发错误:线程“主”中的异常 java.lang.IllegalArgumentException:没有枚举常量Color.red

enum class Color(val value: String = "") {
    RED("red"),
    YELLOW("yellow"),
    BLUE("blue")
}

fun main() {    
   print(Color.valueOf("red"))
}

仅当我将打印语句更改为以下内容时,以上内容才有效:

   print(Color.valueOf("RED"))

是否可以使用自定义字符串通过valueOf分配给枚举值?

3 个答案:

答案 0 :(得分:1)

否,但是您可以编写自己的方法并通过迭代,when或映射来获取值。

此外,您不能覆盖valueOf

答案 1 :(得分:0)

您发现,枚举valueOf()方法是按枚举常量的名称查找的,而不是按您添加的任何属性查找的。

但是您可以使用所需的任何条件轻松添加自己的查找方法:

enum class Color(val hue: String) {
    RED("red"),
    YELLOW("yellow"),
    BLUE("blue");

    companion object {
        fun forHue(hue: String) = values().find{ it.hue == hue }
    }
}

Color.forHue("red")的调用将按预期返回Color.RED实例。

(这可能是最简单的方法,但不是最有效;请参见诸如this之类的答案。)

答案 2 :(得分:0)

您可以实现自己的valueOf,不区分大小写:

enum class Color(val value: String = "") {
    RED("red"),
    YELLOW("yellow"),
    BLUE("blue");

    companion object {
        //TODO: gimme a better name
        fun customValueOf(val: String) = valueOf(val.toUpperCase())
    }
}