美文网首页
Kotlin面向对象之枚举类(Enum Classes)

Kotlin面向对象之枚举类(Enum Classes)

作者: 已迁至知乎_此不再维护 | 来源:发表于2017-05-27 08:59 被阅读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接口,自然顺序则是在枚举类中定义它们的顺序。

    相关文章

      网友评论

          本文标题:Kotlin面向对象之枚举类(Enum Classes)

          本文链接:https://www.haomeiwen.com/subject/fniffxtx.html