kotlin使用enum class关键字定义枚举类,可以实现一个或多个接口;
枚举类的所有实例必须在***第一行显示列出***,实例间用“,”隔开,以“;”结束
枚举类可以有自己的
属性、
方法、
构造器(构造器只能使用private修饰符,省略则默认使用private);
枚举类应该被设为不可变类,属性不应该允许改变,推荐属性***为只读属性***,因此该属性必须在构造器或者初始化块中指定(一般不会再定义时指定初始值,这样每个实例属性就一样的,也就失去意义),因此,一般需要显示定义带参数的构造器;
Enum class Human(val name:String){
Women("女"),Men("男");
}
如果枚举类没有显示定义构造器,可以直接列出枚举值,无须括号,如:
Enum class Human{
Women,Men
}
枚举类默认继承Kotlin.Enum类而不是Any类,因此,枚举类不能显示在继承其他类;而Enuml类实现了kotlin.Comparable接口
***非抽象枚举类不能使用open修饰符,因此非抽象枚举类不能派生子类,但可以实现0~N个接口;***当然同样需要实现接口中的抽象方法
枚举类默认提供的两个方法:
使用枚举类实例:
EnumClass.枚举值
前面小结说了,枚举类默认继承kotlin.Enum类,枚举类自然就可以使用继承的属性、方法
属性:
name:返回此枚举实例名称
ordinal:返回枚举值在枚举类中的索引值(第一个枚举值是0…以此类推)
方法:
int compareTo(E o):和同类型的枚举实例比较,比较的是枚举值索引,如果该枚举值位于指定枚举对象之前,返回整数,否则返回0
String toString():返回枚举常量名称
Kotlin1.1开始,提供了两个泛型方法:
EnumValues():获取所有枚举值数组
EnumValueOf(value:String):获取枚举实例
抽象枚举类不能使用"abstract"修饰,系统会自动为它添加abstract关键字;
我们说过枚举类需要显示创建枚举值,说以在定义枚举值是需要显示为抽象成员提供实现;
比如:
interface Output{
fun output()
}
enum class Operator:Output{
PLUS {
override fun evl(a: Int, b: Int):Int {
return a+b
}
override fun ouput() {
}
},
DIV {
override fun evl(a: Int, b: Int):Int {
return a/b
}
override fun ouput() {
}
},
TIMES {
override fun evl(a: Int, b: Int):Int {
return a*b
}
override fun ouput() {
}
},MINUS {
override fun evl(a: Int, b: Int):Int {
return a-b
}
override fun ouput() {
}
};
abstract fun evl(a:Int,b:Int): Int
}
这里创建PLUS、MINUS枚举值,并不是直接创建Operator枚举类的实例,而是创建其子类的Operator的匿名子类的实例;