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接口,自然顺序则是在枚举类中定义它们的顺序。

上一篇下一篇

猜你喜欢

热点阅读