Kotlin Reference: Enum Classes
枚举类最基础的应用是实现类型安全的枚举:
[code lang=”kotlin”]enum class Direction {
NORTH, SOUTH, WEST, EAST
}[/code]
每一个枚举常量都是一个对象,每个枚举常量之间以逗号分隔。
1. Initialization
由于每一个枚举都是枚举类的实例,故而它们可以被初始化:
[code lang=”kotlin”]enum class Color(val rgb: Int) {
RED(0xFF0000),
GREEN(0x00FF00),
BLUE(0x0000FF)
}[/code]
2. Anonymous Classes
枚举常量可以声明自己的匿名类:
[code lang=”kotlin”]enum class ProtocolState {
WAITING {
override fun signal() = TALKING
},
TALKING {
override fun signal() = WAITING
};
abstract fun signal(): ProtocolState
}[/code]
匿名类可以有自己的方法,也可以覆盖父类的方法。需要注意的是,如果枚举类中定义了成员,就需要使用分号来分隔枚举常量定义和成员定义,和 Java 一样。
3. Working with Enum Constants
Kotlin 也像 Java 一样提供了列出已定义的枚举常量的方法,以及根据名称获取枚举常量的方法,这些方法的签名如下(假设枚举类名为 EnumClass
):
[code lang=”kotlin”]EnumClass.valueOf(value: String): EnumClass
EnumClass.values(): Array
如果 valueOf()
不能将指定的名称和枚举类中定义的枚举常量相匹配,则会抛出 IllegalArgumentException
异常。
从 Kotlin 1.1 开始,可以使用 enumValues<T>()
和 enumValueOf<T>()
函数,以泛型的方式来访问枚举类中的常量:
[code lang=”kotlin”]enum class RGB { RED, GREEN, BLUE }
inline fun &ltreified T : Enum&ltT&rt&rt printAllValues() {
print(enumValues&lt&rt().joinToString { it.name })
}
printAllValues
【注】上面的代码中,printAllValues<RGB>()
以泛型的方式传递了枚举类 RGB
,通过 enumValues<T>()
获取了 RGB
中定义的所有枚举常量。reified
表示具体化参数类型。
每个枚举常量都有以下属性,可以获取枚举常量的名称,及其在枚举类中定义的位置:
[code lang=”kotlin”]val name: String
val ordinal: Int[/code]
枚举常量也实现了 Comparable
接口,比较使用的是常量在枚举类中定义的自然顺序。