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[/code]

  如果 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() // prints RED, GREEN, BLUE[/code]

【注】上面的代码中,printAllValues<RGB>() 以泛型的方式传递了枚举类 RGB,通过 enumValues<T>() 获取了 RGB 中定义的所有枚举常量。reified 表示具体化参数类型

  每个枚举常量都有以下属性,可以获取枚举常量的名称,及其在枚举类中定义的位置:

[code lang=”kotlin”]val name: String
val ordinal: Int[/code]

  枚举常量也实现了 Comparable 接口,比较使用的是常量在枚举类中定义的自然顺序。