Классы перечислений
Наиболее простое использование классов перечислений — это реализация типов-перечислений с проверкой типов:
enum class Direction {
NORTH, SOUTH, WEST, EAST
}
Каждая константа перечисления — это объект. Константы перечисления разделяются запятыми.
Инициализация
Так как каждое перечисление является экземпляром класса перечисления, их можно инициализировать следующим образом:
enum class Color(val rgb: Int) {
RED(0xFF0000),
GREEN(0x00FF00),
BLUE(0x0000FF)
}
Анонимные классы
Константы перечисления также могут объявлять свои анонимные классы со своими соответствующими методами, а также переопределять базовые методы.
enum class ProtocolState {
WAITING {
override fun signal() = TALKING
},
TALKING {
override fun signal() = WAITING
};
abstract fun signal(): ProtocolState
}
Если класс перечисления определяет какие-либо члены, разделяйте определения констант перечисления и определения членов точкой с запятой.
Элементы перечисления не могут содержать вложенные типы, кроме вложенных классов (устарело в Kotlin 1.2).
Реализация интерфейсов в классах перечислений
Класс перечисления может реализовывать интерфейс (но не наследовать от класса), предоставляя либо реализацию членов одного интерфейса для всех элементов, либо отдельные реализации для каждого элемента в его анонимном классе. Это делается путем добавления интерфейсов в объявление класса перечисления следующим образом:
import java.util.function.BinaryOperator
import java.util.function.IntBinaryOperator
//sampleStart
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)
}
//sampleEnd
fun main() {
val a = 13
val b = 31
for (f in IntArithmetics.values()) {
println("$f($a, $b) = ${f.apply(a, b)}")
}
}
Работа с константами перечисления
В Kotlin классы перечислений имеют синтетические методы, позволяющие перечислить определенные константы перечисления и получить константу перечисления по ее имени. Подписи этих методов следующие (предполагая, что имя класса перечисления — EnumClass):
EnumClass.valueOf(value: String): EnumClass EnumClass.values(): Array<EnumClass>
Метод valueOf() генерирует исключение IllegalArgumentException, если указанное имя не соответствует ни одной из констант перечисления, определенных в классе.
Начиная с Kotlin 1.1, можно получить доступ к константам в классе перечисления обобщенным способом, используя функции 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>() // prints RED, GREEN, BLUE
Каждая константа перечисления имеет свойства для получения ее имени и позиции в объявлении класса перечисления:
val name: String val ordinal: Int
Константы перечисления также реализуют интерфейс Comparable, причем естественный порядок соответствует порядку их определения в классе перечисления.
© 2010–2020 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/reference/enum-classes.html