Spec-Zone.ru › Kotlin 1.9

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

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

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

Дополнительную информацию об инлайновых функциях и параметрах типа reified см. в разделе Инлайновые функции.

В 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
}
Последнее изменение: 14 июля 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