在对 密封类 的学习过程中我们知道两者之间有所相同,那就具体学习一下 Kotlin 中的枚举类。
1. 基本实现
enum class Direction {
NORTH, SOUTH, WEST, EAST
}
每一个枚举常量都是一个对象,枚举常量间使用逗号分隔。
2. 枚举初始化
enum class OzWitch(val des: String) {
WEST("west"),
NORTH("north"),
EAST("east"),
SOUTH("south");
}
枚举类的每一个枚举常量都是枚举类的实例,所以可以如上所示通过 构造函数 进行初始化。
3. 向枚举类中添加方法
除了不能继承一个 enum 外,我们基本可以把 enum 看作一个常规的类,我们可以向 enum 添加方法。
enum class OzWitch(var des: String) {
WEST("west"),
NORTH("north"),
EAST("east"),
SOUTH("south");
fun allData(): String? {
for (it in values())
des += it
return des
}
}
具体调用:
object Main {
@JvmStatic
fun main(args: Array<String>) {
for(it in OzWitch.values()){
println(it)
println(it.allData())
}
}
}
正常打印日志如下:
WEST
westWESTNORTHEASTSOUTH
NORTH
northWESTNORTHEASTSOUTH
EAST
eastWESTNORTHEASTSOUTH
SOUTH
southWESTNORTHEASTSOUTH
从打印结果来看,每一个枚举常量实例都会调用相同的方法、行为(其具体逻辑也是相同的)。
如何加载自己的逻辑?有两种方法:
- 匿名类
- 接口实现
4. 匿名类
枚举类常量可以声明自己的匿名类:
- OzWitch
enum class OzWitch(var des: String) {
WEST("west") {
override fun showDes() {
println("i am ${des}")
}
},
NORTH("north") {
override fun showDes() {
println("i am ${des}")
}
},
EAST("east") {
override fun showDes() {
println("i am ${des}")
}
},
SOUTH("south") {
override fun showDes() {
println("i am ${des}")
}
};
abstract fun showDes()
}
- Main
object Main {
@JvmStatic
fun main(args: Array<String>) {
for(it in Location.values()){
println(it)
it.setStr()
}
}
}
- 打印日志
NORTH
i am north
SOUTH
i am south
EAST
i am east
WEST
i am west
枚举类的每个实例对象都执行了自己相应的方法逻辑。
5.枚举实现接口
- Info
interface Info {
fun showInfo():String
}
- OzWitch
enum class OzWitch(var des: String):Info {
WEST("west") {
override fun showInfo(): String {
return "i am ${des}"
}
},
EAST("east") {
override fun showInfo(): String {
return "i am ${des}"
}
},
SOUTH("south") {
override fun showInfo(): String {
return "i am ${des}"
}
},
NORTH("north") {
override fun showInfo(): String {
return "i am ${des}"
}
};
}
- Main
object Main {
@JvmStatic
fun main(args: Array<String>) {
for(it in OzWitch.values()){
println(it)
println(it.showInfo())
}
}
}
- 日志打印
WEST
i am west
EAST
i am east
SOUTH
i am south
NORTH
i am north
枚举类的每个实例对象都执行了自己相应的方法逻辑。