Clases de enumeración de Kotlin

El uso más básico de una clase de enumeración es implementar una enumeración de tipo seguro.

Las constantes de enumeración se separan por comas, y cada constante de enumeración es un objeto.

enum class Color{
    RED,BLACK,BLUE,GREEN,WHITE
}

Inicialización de la enumeración

Cada enumeración es una instancia de la clase de enumeración, y pueden inicializarse:

enum class Color(val rgb: Int) {
    RED(0xFF0000),
    GREEN(0x00FF00),
    BLUE(0x0000FF)
}

El nombre predeterminado es el nombre de la constante de enumeración, y el valor comienza en 0. Si necesita especificar un valor, puede usar su constructor:

enum class Shape(value:Int){
    ovel(100),
    rectangle(200)
}

Las enumeraciones también admiten declarar sus propias clases anónimas y los métodos correspondientes, así como sobrescribir métodos de la clase base. Por ejemplo:

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

    TALKING {
        override fun signal() = WAITING
    };

    abstract fun signal(): ProtocolState
}

Si la clase de enumeración define cualquier miembro, debe usar un punto y coma para separar las definiciones de constantes de enumeración de las definiciones de miembros.


Uso de constantes de enumeración

Las clases de enumeración en Kotlin tienen métodos sintéticos que permiten iterar sobre las constantes de enumeración definidas y obtener la constante de enumeración por su nombre.

EnumClass.valueOf(value: String): EnumClass  // 转换指定 name 为枚举值,若未匹配成功,会抛出IllegalArgumentException
EnumClass.values(): Array<EnumClass>        // 以数组的形式,返回枚举值

Obtener información relevante de la enumeración:

val name: String //获取枚举名称
val ordinal: Int //获取枚举值在所有枚举数组中定义的顺序

Ejemplo

enum class Color{
    RED,BLACK,BLUE,GREEN,WHITE
}

fun main(args: Array<String>) {
    var color:Color=Color.BLUE

    println(Color.values())
    println(Color.valueOf("RED"))
    println(color.name)
    println(color.ordinal)

}

Desde Kotlin 1.1, se puede usarenumValues<T>()yenumValueOf<T>()la función para acceder de forma genérica a las constantes de la clase de enumeración:

enum class RGB { RED, GREEN, BLUE }

inline fun <reified T : Enum<T>> printAllValues() {
    print(enumValues<T>().joinToString { it.name })
}



fun main(args: Array<String>) {
    printAllValues<RGB>() // 输出 RED, GREEN, BLUE
}
Otras extensiones