Классы перечислений
Наиболее простое применение классов перечислений — реализация типов-перечислений с проверкой типов:
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
}
Если класс перечисления определяет члены, константы перечисления следует отделять от определений членов точкой с запятой.
Реализация интерфейсов в классах перечислений
Класс перечисления может реализовывать интерфейс (но не может наследоваться от класса), обеспечивая либо общее реализацию членов интерфейса для всех элементов, либо отдельные реализации для каждого элемента внутри своего анонимного класса. Это делается путем добавления реализуемых интерфейсов в объявление класса перечисления следующим образом:
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)}")
}
}
Все классы перечислений по умолчанию реализуют интерфейс Comparable. Константы в классе перечисления определяются в естественном порядке. Дополнительную информацию см. в разделе Сортировка.
Работа с константами перечислений
Классы перечислений в Kotlin имеют синтетические методы для перечисления определенных констант перечислений и получения константы перечисления по ее имени. Подписи этих методов следующие (предполагается, что имя класса перечисления — EnumClass):
EnumClass.valueOf(value: String): EnumClass EnumClass.values(): Array<EnumClass>
Ниже приведен пример использования этих методов:
enum class RGB { RED, GREEN, BLUE }
fun main() {
for (color in RGB.values()) println(color.toString()) // prints RED, GREEN, BLUE
println("The first color is: ${RGB.valueOf("RED")}") // prints "The first color is: RED"
}
Метод valueOf() вызывает исключение IllegalArgumentException, если указанное имя не соответствует ни одной из констант перечислений, определенных в классе.
Вы можете получить доступ к константам в классе перечисления универсальным способом, используя функции 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
В Kotlin 1.9.0 добавлена свойство entries, которая заменяет функцию values(). Свойство entries возвращает предварительно выделенный неизменяемый список ваших констант перечислений. Это особенно полезно при работе со коллекциями и может помочь избежать проблем производительности.
Например:
enum class RGB { RED, GREEN, BLUE }
fun main() {
for (color in RGB.entries) println(color.toString())
// prints RED, GREEN, BLUE
}
Каждый константный элемент перечисления также имеет свойства: name и ordinal, для получения его имени и позиции (начиная с 0) в объявлении класса перечисления:
enum class RGB { RED, GREEN, BLUE }
fun main() {
//sampleStart
println(RGB.RED.name) // prints RED
println(RGB.RED.ordinal) // prints 0
//sampleEnd
}
© 2010–2023 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/enum-classes.html