Spec-Zone.ru › Kotlin 1.8

Классы перечислений

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

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>

Метод 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

Каждая константа перечисления имеет свойства для получения её имени и позиции (начиная с 0) в объявлении класса перечисления:

val name: String
val ordinal: Int
Последнее изменение: 10 января 2023 г.
Вложенные и внутренние классы Встроенные классы

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API