Enum классы

Наиболее простое использование enum клссов это реализациия type-safe enums:

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

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

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

Так как каждый 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 определяет какие-либо члены, вам нужно отделить определения константы enum от определений членов с помтощью точки с запятой, как и в Java.

Enum члены не могут содержать вложенные типы, отличные от внутренних классов (устарело в Kotlin 1.2).

Реализация интерфейсов в Enum классах

Enum класс может реализовывать интерфейс (но не наследоваться от класса), обеспечивая реализацию каждого интерфейса для всего списка констант, или разделяя один от другого с помощью анонимного класса. Для этого нужно добавить интерфейсы в объявление enum класса следующим образом:

enum class IntArithmetics : BinaryOperator<Int>, IntBinaryOperator {
    PLUS {
    override fun apply(t: Int, u: Int): Int = t + u
    },
    TIMES {
    override fun apply(t: Int, u: Int): Int = t * u
    };
    ​
    override fun applyAsInt(t: Int, u: Int) = apply(t, u)
    }​

Работа с Enum константами

Как и в Java, классы enum в Kotlin имеют синтетические методы, позволяющие перечислять определенные константы enum и получать константу enum по ее имени. Сигнатуры таких методов, предположим имя enum класс является EnumClass, выглядят следующим образом:

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

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

Начиная с Kotlin 1.1 возможен доступ к константам в enum классе через дженерики, используя enumValues<T>() и enumValueOf<T>() функции.

enum class RGB { RED, GREEN, BLUE }

inline fun <reified T : Enum<T>> printAllValues() {
    print(enumValues<T>().joinToString { it.name })
}

printAllValues<RGB>() // выведет RED, GREEN, BLUE

Каждая enum константа имеет свойства для получения своего имени и позиции в описании enum класса:

val name: String
val ordinal: Int

Константы также реализуют интерфейс Comparable с естественным порядком, в котором они определены в enum классе.

Комментарии

Популярные сообщения из этого блога

Псевдонимы типов

Идиомы

Базовый синтаксис