1.1.50.16. fejezet, Enum osztályok

enum class Direction {
    NORTH, SOUTH, WEST, EAST
}

Minden enum konstans egy objektum.

Anonim osztályok

enum class ProtocolState {
    WAITING {
        override fun signal() = TALKING
    },
 
    TALKING {
        override fun signal() = WAITING
    };
 
    abstract fun signal(): ProtocolState
}

Interfész implementálása enum osztályba

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)
}

Hogyan használjuk

enum class RGB { RED, GREEN, BLUE }
 
fun main() {
    for (color in RGB.entries) println(color.toString()) // prints RED, GREEN, BLUE
    println("The first color is: ${RGB.valueOf("RED")}") // prints "The first color is: RED"
    println(RGB.RED.name)    // prints RED
    println(RGB.RED.ordinal) // prints 0
}
 
enum class RGB { RED, GREEN, BLUE }
 
inline fun <reified T : Enum<T>> printAllValues() {
    println(enumValues<T>().joinToString { it.name })
}
 
printAllValues<RGB>() // prints RED, GREEN, BLUE

A Kotlin 1.9.20-ban bevezették a enumEntries() függvényt, leváltva a enumValues() függvényt.

enum class RGB { RED, GREEN, BLUE }
 
@OptIn(ExperimentalStdlibApi::class)
inline fun <reified T : Enum<T>> printAllValues() {
    println(enumEntries<T>().joinToString { it.name })
}
 
printAllValues<RGB>()
// RED, GREEN, BLUE

Mivel az enumEntries kíséleti fázisban van, használjuk az @OptIn annotációt.