kotlin枚举类enum class

1.概念

​ 与Java一样,枚举类是一种特殊的类,kotlin可以通过enum class关键字定义枚举类。

2.注意点

  • 枚举类可以实现0~N个接口;
  • 枚举类默认继承于kotlin.Enum类(其他类最终父类都是Any),因此kotlin枚举类不能继承类
  • 非抽象枚举类不能用open修饰符修饰,因此非抽象枚举类不能派生子类;
  • 抽象枚举类不能使用abstract关键字修饰enum class,抽象方法和抽象属性需要使用;
  • 枚举类构造器只能使用private修饰符修饰,若不指定,则默认为private;
  • 枚举类所有实例在第一行显式列出,每个实例之间用逗号隔开,整个声明以分号结尾;
  • 枚举类是特殊的类,也可以定义属性、方法、构造器;
  • 枚举类应该设置成不可变类,即属性值不允许改变,这样更安全;
  • 枚举属性设置成只读属性后,最好在构造器中为枚举类指定初始值,如果在声明时为枚举指定初始值,会导致所有枚举值(或者说枚举对象)的该属性都一样。

3.定义枚举类

/**
 * 定义一个枚举类
 * 定义枚举类接口,接口给只读属性复制
 */
enum class EnumClass(val enumParam: String) {
    MON("星期一"), TUES("星期二"), WED("星期三");//逗号隔开,分号结尾

    /**
     * 枚举类方法
     */
    fun enumFun() {
        println("枚举值:$this 枚举属性:$enumParam")
    }
}

fun main(args: Array<String>) {
    println(EnumClass.MON)//获取枚举值,此处相当于调用枚举值的toString   结果:MON
    println(EnumClass.MON.name)//获取枚举值的名字,相当于枚举值调用toString  结果:MON
    println(EnumClass.MON.enumParam)//获取枚举属性    结果:星期一
    EnumClass.MON.enumFun()//调用枚举方法     结果:枚举值:MON 枚举属性:星期一
    println(EnumClass.valueOf("MON"))//通过枚举字符串名获取枚举值,EnumClass.valueOf("MON")<=>EnumClass.MON   结果:MON
    println(EnumClass.valueOf("MON").enumParam)//获取该枚举值的属性  结果:星期一
    EnumClass.valueOf("MON").enumFun()//调用该枚举值的方法   结果:枚举值:MON 枚举属性:星期一
    println(EnumClass.values().joinToString { it.name })//获取该枚举值所有枚举值组成的数组并打印出枚举名   结果:MON, TUES, WED
    println(EnumClass.MON.ordinal)//获取枚举值在枚举类中定义位置  结果:0
    println(enumValueOf<EnumClass>("MON"))//通过枚举值名字获取枚举值<=>EnumClass.valueOf("MON")<=>EnumClass.MON     结果:MON
    println(enumValues<EnumClass>().joinToString { it.name })//获取指定枚举所有枚举值<=>EnumClass.values() 结果:MON, TUES, WED
}

4.枚举类实现接口

(1)方式一:枚举值分别实现接口的抽象成员

/**
 * 定义一个枚举类
 * 定义枚举类接口,接口给只读属性复制
 */
enum class EnumClass(val enumParam: String) : EnumInterface {
    MON("星期一") {
        override fun interfaceFun() {
            println(enumParam)
        }

        override val interfaceParam: String
            get() = "1"
    },
    TUES("星期二") {
        override fun interfaceFun() {
            println(enumParam)
        }

        override val interfaceParam: String
            get() = "2"
    },
    WED("星期三") {
        override fun interfaceFun() {
            println(enumParam)
        }

        override val interfaceParam: String
            get() = "3"
    };//逗号隔开,分号结尾
}

fun main(args: Array<String>) {
    EnumClass.MON.interfaceFun()//调用枚举对象实现的抽象方法 结果:星期一
    println(EnumClass.MON.interfaceParam)//调用枚举对象实现的抽象属性    结果:1
}

interface EnumInterface {
    fun interfaceFun()
    val interfaceParam : String
}

(2)方式二:枚举类统一实现接口的抽象成员

/**
 * 定义一个枚举类
 * 定义枚举类接口,接口给只读属性复制
 */
enum class EnumClass(val enumParam: String) : EnumInterface {
    MON("星期一"),
    TUES("星期二"),
    WED("星期三");//逗号隔开,分号结尾

    override fun interfaceFun() {
        println("统一实现的接口的抽象方法")
    }

    override val interfaceParam: String
        get() = "统一实现的抽象属性"
}

fun main(args: Array<String>) {
    EnumClass.MON.interfaceFun()//调用枚举对象实现的抽象方法 结果:统一实现的接口的抽象方法
    println(EnumClass.MON.interfaceParam)//调用枚举对象实现的抽象属性    结果:统一实现的抽象属性
}

interface EnumInterface {
    fun interfaceFun()
    val interfaceParam: String
}

5.抽象枚举类

只能通过枚举值分别实现抽象枚举类抽象成员

/**
 * 抽象枚举类
 */
enum class AbstractEnumClass {
    MON {
        override val abstractParam: String
            get() = "星期一"

        override fun abstractFun() {
            println(abstractParam)
        }
    },
    TUES {
        override val abstractParam: String
            get() = "星期二"

        override fun abstractFun() {
            println(abstractParam)
        }
    },
    WED {
        override val abstractParam: String
            get() = "星期三"

        override fun abstractFun() {
            println(abstractParam)
        }
    };

    abstract val abstractParam: String
    abstract fun abstractFun()
}

fun main(args: Array<String>) {
    AbstractEnumClass.MON.abstractFun()//调用枚举对象实现的抽象方法 结果:星期一
    println(AbstractEnumClass.MON.abstractParam)//调用枚举对象实现的抽象属性    结果:星期一
}
posted @ 2019-06-04 14:15  谢光伟  阅读(2873)  评论(0编辑  收藏  举报