Как объявить переменную типа перечисления в 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")