kotlin 中也如Java一样,有枚举类这个类型。
枚举类的定义:在某些情况下,一个类的是有限而且固定的,比如季节类、月份类、等等,这种实例有限而且固定的类,叫做枚举类。
作用:在早期代码中,可能会使用静态常量表示枚举,比如下面定义的常量:
//申请手机状态的权限的 回执码
var REQUEST_READ_PHONE_STATE: Int = 1001
//申请手机存储权限的 回执码
var REQUEST_READ_EXTERNAL_STORAGE: Int = 1002
以上声明的方法简单明了,但是会有几个问题:
- 类型不安全:
- 没有命名空间:在定义的时候,必须要加上 类似“SEASON_”的关键字进行定义,否则可能会和程序的其他常量混淆使用。
- 打印输出的意义不明确:比如当输出 REQUEST_READ_PHONE_STATE 时,实际输出的值未 1001,无法见值知意
通过定义普通类来实现枚举的话,缺点明显,代码量变大,实现起来就很麻烦了。
Java 在JDK1.5后就增加了枚举类的支持。
枚举类的关键字为enum,声明方式:
enum class clazzName{
}
枚举类和 普通类的几个简单的区别:
- 枚举类可以实现一个或者多个接口,使用enum定义的枚举类 默认继承了 java.lang.Enum类,而不是默认继承Object类,因此枚举类不能显式继承其他父类,其中 java.lang.Enum类实现了 Serializable和Comparable两个接口。
- 使用enum定义的枚举类,默认会使用final关键字进行修饰,因此枚举类不能派生子类。
- 枚举类的构造函数只能使用private修饰,无论是否指定,都是只能使用private访问修饰符。
- 枚举类的所有实例必须在第一行全部显式列出,否则这个枚举类永远都不会产生实例,在列出实例之后,系统会默认添加 pubulic static final 修饰,无需我们手动添加。
枚举类默认是提供了 values()方法,可以很方便遍历出所有的枚举值。
枚举类可以实现多个接口的同时,也可以包含抽象方法。
下面举一个,实现一个接口,并包含了一个抽象方法的枚举类案例:
//定义一个 枚举类,实现一个接口
enum class EnumWeeks : EnumInterface {
//实现接口后,默认是每个实例都实现此接口方法
Monday("星期一") {
override fun printValue() {
println("你好,我是${getValue()}")
}
override fun doSomething() {
println("你好,我是周一")
}
},
Tuesday("星期二") {
override fun printValue() {
println("你好,我是${getValue()}")
}
override fun doSomething() {
println("你好,我是周二")
}
};
private var value: String = ""
//构造函数,使用private修饰
private constructor(value: String) {
this.value = value
}
//获取枚举类 实例的 值
fun getValue(): String {
return value
}
//定义的抽象方法
abstract fun printValue()
}
//程序入口
fun main(args: Array<String>) {
println(EnumWeeks.Monday.getValue())
EnumWeeks.Monday.doSomething()
}
接口EnumInterface如下:
//定义一个接口
interface EnumInterface {
fun doSomething()
}
运行程序:打印信息如下:
星期一
你好,我是周一
你好,我是星期一
Process finished with exit code 0
以上是枚举类的部分介绍和部分使用方法的简单介绍,不正请指出。