Как объявить переменную типа перечисления в Kotlin?
Согласно документации, создан класс enum
enum class BitCount public constructor(val value : Int)
{
x32(32),
x64(64)
}
Затем я пытаюсь объявить переменную в некоторой функции
val bitCount : BitCount = BitCount(32)
но есть ошибка компиляции
Как объявить переменную типа BitCount и инициализировать ее из Int
?
Ошибка: (18, 29) Kotlin: типы Enum не могут быть созданы
Ответы
Ответ 1
Экземпляры Enum могут быть объявлены только внутри объявления класса enum.
Если вы хотите создать новый BitCount, просто добавьте его, как показано ниже:
enum class BitCount public constructor(val value : Int)
{
x16(16),
x32(32),
x64(64)
}
и использовать везде как BitCount.x16
.
Ответ 2
Как указано в других ответах, вы можете ссылаться на любое значение enum
которое существует по имени, но не создавать новое. Это не мешает вам делать что-то похожее на то, что вы пытались...
// wrong, it is a sealed hierarchy, you cannot create random instances
val bitCount : BitCount = BitCount(32)
// correct (assuming you add the code below)
val bitCount = BitCount.from(32)
Если вы хотите найти экземпляр enum
на основе числового значения 32
вы можете сканировать значения следующим образом. Создайте enum
с companion object
и функцией from()
:
enum class BitCount(val value : Int)
{
x16(16),
x32(32),
x64(64);
companion object {
fun from(findValue: Int): BitCount = BitCount.values().first { it.value == findValue }
}
}
Затем вызовите функцию, чтобы получить соответствующий существующий экземпляр:
val bits = BitCount.from(32) // results in BitCount.x32
Приятно и красиво. В качестве альтернативы в этом случае вы можете создать имя значения enum
из числа, поскольку у вас есть предсказуемая связь между ними, а затем используйте BitCount.valueOf()
. Вот новая функция from()
внутри объекта-компаньона.
fun from(findValue: Int): BitCount = BitCount.valueOf("x$findValue")