Kotlin面向对象之枚举类(Enum Classes)
2017-05-27 本文已影响0人
已迁至知乎_此不再维护
枚举类的最基本用法是实现类型安全的枚举
enum class Direction {
NORTH, SOUTH, WEST, EAST
}
枚举常量是一个对象。枚举常量之间以逗号分隔。
初始化(Initialization)
由于每一个枚举值都是枚举类的实例,因此它们可以如此实例化:
enum class Color(val rgb: Int) {
RED(0xFF0000),
GREEN(0x00FF00),
BLUE(0x0000FF)
}
匿名类(Anonymous Classes)
枚举常量也可以声明它们自己的匿名类:
enum class ProtocolState {
WAITING {
override fun signal() = TALKING
},
TALKING {
override fun signal() = WAITING
};
abstract fun signal(): ProtocolState
}
可以具有相应的方法,也可以重写基本方法。请注意,如果枚举类定义任何成员,则需要使用分号将枚举常量定义与成员定义分开,就像在Java中一样。
使用枚举常量(Working with Enum Constants)
就像Java一样,Kotlin中的枚举类具有合成方法,允许遍历定义的枚举常量,并通过其名称获取枚举常数。 这些方法的签名如下(假设枚举类的名称为EnumClass):
EnumClass.valueOf(value: String): EnumClass
EnumClass.values(): Array<EnumClass>
在使用valueOf()方法的时候,如果定义的所有的枚举常量都没有匹配到给定的名称,则将抛出IllegalArgumentException
。
从Kotlin1.1开始,可以通过泛型方法获取枚举类的常量,使用enumValues<T>()
和enumValueOf<T>()
函数:
enum class RGB { RED, GREEN, BLUE }
inline fun <reified T : Enum<T>> printAllValues() {
print(enumValues<T>().joinToString { it.name })
}
printAllValues<RGB>() // prints RED, GREEN, BLUE
每个枚举常量都有属性可以在枚举类声明中获取其名称和位置:
val name: String
val ordinal: Int
枚举常量也可以实现Comparable
接口,自然顺序则是在枚举类中定义它们的顺序。