Как создать перечисление из строки в Котлин?

У меня есть перечисление с некоторыми экземплярами Foo и Bar. Если у меня есть строка "Foo", как я могу создать экземпляр Foo из этого? В С# это будет Enum.Parse(...), есть ли эквивалент в Kotlin?

В настоящее время я нашел лучший способ создать factory, который включает все возможные строки, но подвержен ошибкам и плохо работает для больших перечислений.

Ответ 1

Классы перечисления Kotlin имеют "статическую" функцию valueOf для получения записи перечисления по строке (как перечисления Java). Кроме того, они имеют "статическую" функцию values для получения всех записей enum. Пример:

enum class MyEnum {
  Foo, Bar, Baz
}

fun main(args : Array<String>) {
  println(MyEnum.valueOf("Foo") == MyEnum.Foo)
  println(MyEnum.valueOf("Bar") == MyEnum.Bar)
  println(MyEnum.values().toList())
}

Ответ 2

Как предложено bashor, используйте MyEnum.valueOf(), но имейте в виду, что оно выдает исключение, если значение не может быть найдено. Я рекомендую использовать:

enum class MyEnum {
  Foo Bar Baz
}

try {
   myVar = MyEnum.valueOf("Qux")
} catch(e: IllegalArgumentException) {
   Log.d(TAG, "INVALID MyEnum value: 'Qux' | $e")
}

Ответ 3

Сделал бы это как

enum class MyEnum {
  Foo, Bar, Baz
}

val value = MyEnum.values().firstOrNull {it.name == "Foo"} // results to MyEnum.Foo