枚举类就是一组命名的常数,是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内.
枚举类的最基本的用法是实现类型安全的枚举:
enum class Direction {
NORTH, SOUTH, WEST, EAST
}
每个枚举常量都是一个对象。枚举常量用逗号分隔。
那枚举类怎么用呢?
println(Direction.EAST.name)
打印结果:
EAST
用 .name 就直接拿到枚举常量本身的字符串。
每个枚举常量都具有在枚举类声明中获取其名称与位置的属性:
val name: String
val ordinal: Int
就是说每个枚举类中的常量都可以 .name 拿到名称, .ordinal 拿到位置。
==========================================================================
那枚举如何使用 Int,boolean等其他类型呢?你可以使用参数初始化枚举类
enum class Season(val temperature: Int) {
SPRING(1),
SUMMER(2),
AUTUMN(3),
WINTER(4),
}
println("name: ${Season.SPRING.name} , temperature: ${Season.SPRING.temperature}")
打印结果:
name: SPRING , temperature: 1
enum class Week(val index: Int, val aliasName: String) {
MONDAY(1, "Mon"),
TUESDAY(2, "Tue"),
WEDNESDAY(3, "Wed"),
THURSDAY(4, "Thu"),
FRIDAY(5, "Fri"),
SATURDAY(6, "Sat"),
SUNDAY(7, "Sun")
}
println("${Week.MONDAY.name} : " +
" index ${Week.MONDAY.index} , aliasName: ${Week.MONDAY.aliasName}")
打印结果:
MONDAY : index 1 , aliasName: Mon
==========================================================================
枚举类可以实现接口
interface MyInterface1 {
fun myMethod1(num: Int)
}
interface MyInterface2 {
fun myMethod2(num: Int)
}
enum class MyEnumClass : MyInterface1, MyInterface2 {
OPERATE1 {
override fun myMethod2() {
println("OPERATE1 对 myMethod2 的特殊实现 ")
}
},
OPERATE2 {
override fun myMethod2() {
println("OPERATE2 对 myMethod2 的特殊实现 ")
}
};
override fun myMethod1() {
println("MyEnumClass 对 myMethod1 的统一实现 ")
}
}
主函数
fun main() {
MyEnumClass.OPERATE1.myMethod1()
MyEnumClass.OPERATE2.myMethod1()
MyEnumClass.OPERATE1.myMethod2()
MyEnumClass.OPERATE2.myMethod2()
}
打印结果:
D:\AndroidStudio\android-studio\jre\bin\java.exe
MyEnumClass 对 myMethod1 的统一实现
MyEnumClass 对 myMethod1 的统一实现
OPERATE1 对 myMethod2 的特殊实现
OPERATE2 对 myMethod2 的特殊实现
Process finished with exit code 0
myMethod1 是在 MyEnumClass 中统一实现的,OPERATE1,OPERATE2 没有自己实现,但是也是可以调用的。
myMethod2 是在 OPERATE1,OPERATE2 中有不同的处理。
那如果 myMethod1 在 MyEnumClass 中有统一实现,那 OPERATE1 或者 OPERATE2 还可不可以重载 myMethod1呢?
答案是可以,在调用的时候会执行自己的特殊实现,而不会执行 MyEnumClass中的统一实现
interface MyInterface1 {
fun myMethod1(num: Int)
}
interface MyInterface2 {
fun myMethod2(num: Int)
}
enum class MyEnumClass : MyInterface1, MyInterface2 {
OPERATE1 {
override fun myMethod2() {
println("OPERATE1 对 myMethod2 的特殊实现 ")
}
},
OPERATE2 {
这里也实现了 myMethod1
override fun myMethod1() {
println("OPERATE2 对 myMethod1 的特殊实现 ")
}
override fun myMethod2() {
println("OPERATE2 对 myMethod2 的特殊实现 ")
}
};
override fun myMethod1() {
println("MyEnumClass 对 myMethod1 的统一实现 ")
}
}
主函数
fun main() {
MyEnumClass.OPERATE1.myMethod1()
MyEnumClass.OPERATE2.myMethod1()
MyEnumClass.OPERATE1.myMethod2()
MyEnumClass.OPERATE2.myMethod2()
}
打印结果:
D:\AndroidStudio\android-studio\jre\bin\java.exe
MyEnumClass 对 myMethod1 的统一实现
OPERATE2 对 myMethod1 的特殊实现
OPERATE1 对 myMethod2 的特殊实现
OPERATE2 对 myMethod2 的特殊实现
Process finished with exit code 0
OPERATE2 在调用myMethod1 的时候打印结果变成: OPERATE2 对 myMethod1 的特殊实现
==========================================================================