Kotlin也支持枚举类
Kotlin使用enum class关键字组合定义枚举类。这是一种特殊的类,它可以有自己的属性、方法,可以实现一个或多个接口,也可以定义自己的构造器。
与普通类的区别:
enum class Season{
//在第一行列出4个枚举实例
SPRING,SUMMER,FALL,WINTER
}
fun main(args: Array<String>) {
//枚举类默认有一个values()方法,返回该枚举类的所有实例
for (s in Season.values()) {
println(s)
}
val seasonName = "SUMMER"
val s: Season = Season.valueOf(seasonName)
println(s)
//直接访问枚举值
println(Season.WINTER)
}
输出结果:
SPRING
SUMMER
FALL
WINTER
SUMMER
WINTER
如果枚举类显式定义了带参数的构造器,在列出枚举值时就必须对应地传入参数。
//使用主构造器声明cnName只读属性
enum class Gender(val cnName: String) {
MALE("男"), FEMALE("女");
//定义方法
fun info() {
when (this) {
MALE -> println("男子汉顶天立地")
FEMALE -> println("窈窕淑女")
}
}
}
fun main(args: Array<String>) {
//通过Gender的valueOf()方法根据枚举名获取枚举值
val g = Gender.valueOf("FEMALE")
//访问枚举值的cnName属性
println("${g}代表:${g.cnName}")
//调用info方法
g.info()
}
输出结果:
FEMALE代表:女
窈窕淑女
枚举类也可以实现一个或多个接口。
interface GenderDesc {
fun info()
}
//使用主构造器声明cnName只读属性
enum class Gender(val cnName: String) : GenderDesc {
MALE("男"), FEMALE("女");
//重写接口中定义的抽象方法
override fun info() {
when (this) {
MALE -> println("男子汉顶天立地")
FEMALE -> println("窈窕淑女")
}
}
}
package `0705`
enum class Operation {
PLUS {
override fun eval(x: Double, y: Double): Double = x + y
},
MINUS {
override fun eval(x: Double, y: Double): Double = x - y
},
TIMES {
override fun eval(x: Double, y: Double): Double = x * y
},
DIVIDE {
override fun eval(x: Double, y: Double): Double = x / y
};
//为枚举类定义一个抽象方法
//这个抽象方法由不同的枚举值提供不同的实现
abstract fun eval(x: Double, y: Double): Double
}
fun main(args: Array<String>) {
println(Operation.PLUS.eval(8.0, 4.0))
println(Operation.MINUS.eval(8.0, 4.0))
println(Operation.TIMES.eval(8.0, 4.0))
println(Operation.DIVIDE.eval(8.0, 4.0))
}
输出结果:
12.0
4.0
32.0
2.0
枚举类中包含抽象方法时依然不可以使用abstract修饰枚举类,在定义每个枚举值时必须为抽象成员提供实现,否则将出现编译错误。