与Java一样,枚举类是一种特殊的类,kotlin可以通过enum class关键字定义枚举类。
- 枚举类可以实现0~N个接口; 枚举类默认继承于kotlin.Enum类(其他类最终父类都是Any),因此kotlin枚举类不能继承类;
- 非抽象枚举类不能用open修饰符修饰,因此非抽象枚举类不能派生子类;
- 抽象枚举类不能使用abstract关键字修饰enum class,抽象方法和抽象属性需要使用;
- 枚举类构造器只能使用private修饰符修饰,若不指定,则默认为private;
- 枚举类所有实例在第一行显式列出,每个实例之间用逗号隔开,整个声明以分号结尾;
- 枚举类是特殊的类,也可以定义属性、方法、构造器;
- 枚举类应该设置成不可变类,即属性值不允许改变,这样更安全;
- 枚举属性设置成只读属性后,最好在构造器中为枚举类指定初始值,如果在声明时为枚举指定初始值,会导致所有枚举值(或者说枚举对象)的该属性都一样。
定义枚举类
枚举类最基本的用法是实现一个类型安全的枚举。
enum class Color {
RED, BLACK, BLUE, GREEN, WHITE
}
枚举常量用逗号分隔, 每个枚举常量都是一个对象。
每一个枚举都是枚举类的实例,它们可以被初始化:
enum class Color(val rgb: String) {
RED("red"),
BLACK("black"),
BLUE("blue"),
GREEN("green"),
WHITE("white")
}
示例:
enum class Color(val rgb: String) {
RED("red"),
GREEN("green");
fun enumFun() {
println("枚举值:$this 枚举属性:$rgb")
}
}
fun main(args: Array<String>) {
println(Color.RED) //获取枚举值
println(Color.RED.name) //获取枚举值名称
println(Color.RED.rgb) //获取枚举值属性
Color.RED.enumFun() //调用枚举方法
println(Color.GREEN) //获取枚举值
println(Color.GREEN.name) //获取枚举值名称
println(Color.GREEN.rgb) //获取枚举值属性
Color.GREEN.enumFun() //调用枚举方法
}
结果:
RED
RED
red
枚举值:RED 枚举属性:red
GREEN
GREEN
green
枚举值:GREEN 枚举属性:green
枚举类实现接口
enum class Color(val rgb: String):EnumInterface {
RED("red") {
override fun interfaceFun() {
println("red")
}
override val interfaceParam: String
get() = "红色"
},
GREEN("green") {
override fun interfaceFun() {
println("green")
}
override val interfaceParam: String
get() = "绿色"
};
fun enumFun() {
println("枚举值:$this 枚举属性:$rgb")
}
}
fun main(args: Array<String>) {
Color.RED.interfaceFun() //调用枚举对象实现的抽象方法
println(Color.RED.interfaceParam) //调用枚举对象实现的抽象属性
Color.GREEN.interfaceFun()
println(Color.GREEN.interfaceParam)
}
结果:
red
红色
green
绿色