Перечисляемые типы

Ниболее базовый пример использования enum — это реализация типобезопасных перечислений

enum class Direction {
    NORTH, SOUTH, WEST, EAST
}

Каждая enum-константа является объектом. При объявлении константы разделяются запятыми.

Инициализация

Так как константы являются экземплярами enum-класса, они могут быть инициализированы

enum class Color(val rgb: Int) {
        RED(0xFF0000),
        GREEN(0x00FF00),
        BLUE(0x0000FF)
}

Анонимные классы

Enum-константы также могут объявлять свои собственные анонимные классы

enum class ProtocolState {
    WAITING {
        override fun signal() = TALKING
    },

    TALKING {
        override fun signal() = WAITING
    };

    abstract fun signal(): ProtocolState
}

как с их собственными методами, так и с перегруженными методами базового класса. Следует заметить, что при объявлении в enum-классе каких-либо членов, необходимо отделять их от списка констант точкой с запятой, так же как и в Java.

Работа с enum-константами

Так же как и в Java, enum-классы в Kotlin имеют стандартные методы для вывода списка объявленных констант и для получения enum-константы по её имени. Ниже приведены сигнатуры этих методов:

EnumClass.valueOf(value: String): EnumClass
EnumClass.values(): Array<EnumClass>

Метод valueOf() выбрасывает исключение IllegalArgumentException, если указанное имя не соответствует ни одной константе, объявленной в классе.

Каждая enum-константа имеет поля, в которых содержатся её имя и порядковый номер в enum-классе:

val name: String
val ordinal: Int

Также, enum-константы реализуют интерфейс Comparable. Порядок сортировки соответствует порядку объявления.