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

Перечисления – это особая разновидность классов в Kotlin, их объявление начинается со слова enum. В простейшем случае класс перечисления содержит лишь список констант.

enum class Fruits {
    BANANA, APPLE, ORANGE, KIWI
}

Значение каждой константы представляет собой объект, созданный от своего класса-перечисления. Доступ к нему получаем через имя класса и константы.

fun main() {
    val orange: Fruits = Fruits.ORANGE
    println(orange) // ORANGE
    println(orange.name) // ORANGE
    println(orange.ordinal) // 2
}

У каждого объекта есть порядковый номер – индекс. Другими словами, объекты класса перечисления упорядочены.

Объекты-значения могут иметь свойства, которые перечисляются в скобках и по сути являются аргументами для конструктора.

enum class Fruits {
    BANANA(10, 0.9), APPLE(12, 1.1),
    ORANGE(5, 1.5), KIWI(15, 1.8);
 
    var qty: Int
    var price: Double
 
    constructor(q: Int, p: Double) {
        qty = q
        price = p
    }
}
fun main() {
    println(Fruits.ORANGE.qty) // 5
}

То же самое с первичным конструктором и созданием свойств в заголовке класса:

enum class Fruits(var qty: Int, var price: Double) {
    BANANA(10, 0.9), APPLE(12, 1.1),
    ORANGE(5, 1.5), KIWI(15, 1.8);
}

Кроме свойств, также как обычные классы, перечисления могут содержать методы.

enum class Fruits(var qty: Int, var price: Double) {
 
    BANANA(10, 0.9), APPLE(12, 1.1),
    ORANGE(5, 1.5), KIWI(15, 1.8);
 
    fun sell(n: Int) {qty -= n}
 
    fun changePrice(newPrice: Double) {
        price = newPrice
    }
}
fun main() {
    val o = Fruits.ORANGE
    println("${o.qty}, ${o.price}") // 5, 1.5
    o.sell(3)
    o.changePrice(1.3)
    println("${o.qty}, ${o.price}") // 2, 1.3
}

С помощью функции values() получают массив всех объектов класса.

Получение всех значений класса enum в Kotlin

fun main() {
    for (i in Fruits.values())
        i.changePrice(0.2)
}

В Kotlin можно импортировать константы из класса-перечисления. В этом случае обращение идет без имени класса.

import Fruits.*
 
fun main() {
    println(ORANGE.qty)
}