Позволяет ли Kotlin назначать пользовательское значение для enum? - PullRequest
0 голосов
/ 28 февраля 2019

Это выдает ошибку: Исключение в потоке "main" 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 голосов
/ 28 февраля 2019

Как вы обнаружили, метод enum valueOf() ищет имя константы enum, а не добавляемые вами свойства.

Но вы можете легко добавить свой собственный метод поиска, используя любые критерии, которые выwant:

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.

(Возможно, это самый простой подход, но не самый эффективный; см. ответы, такие как это .)

0 голосов
/ 28 февраля 2019

Вы можете реализовать свой собственный 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())
    }
}
0 голосов
/ 28 февраля 2019

Нет, но вы можете написать свой собственный метод и получить значение путем итерации, when или map.

Кроме того, вы не можете переопределить valueOf.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...