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)//调用枚举对象实现的抽象属性 结果:星期一
}