Spec-Zone.ru › Kotlin 1.7

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

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

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
Последнее изменение: 20 июля 2022 г.
Вложенные и внутренние классы Встроенные классы

© 2010–2022 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