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 классе.
Комментарии
Отправить комментарий