Kotlin筆記 第八章 (七)列舉類
列舉類
1.1 成員
kotlin使用enum class關鍵字定義列舉類,可以實現一個或多個介面;
列舉類可以有自己的
屬性、
方法、
構造器(構造器只能使用private修飾符,省略則預設使用private);
1.1.1 屬性
列舉類屬性***只能是隻讀屬性***,因此該屬性必須在構造器或者初始化塊中指定(一般不會再定義時指定初始值,這樣每個例項屬性就一樣的,也就失去意義),因此,一般需要顯示定義帶引數的構造器;
Enum class Human(val name:String){
Women("女"),Men("男");
}
如果列舉類沒有顯示定義構造器,可以直接列出列舉值,無須括號,如: Enum class Human{
Women,Men
}
列舉類預設繼承Kotlin.Enum類而不是Any類,因此,列舉類不能顯示在繼承其他類;而Enuml類實現了kotlin.Comparable介面
***非抽象列舉類不能使用open修飾符,因此非抽象列舉類不能派生子類,但可以實現0~N個介面;***當然同樣需要實現介面中的抽象方法
列舉類預設提供的兩個方法:
- EnumClass.valuesOf(value:String):EnumClass :根據列舉字串名獲取物件
- EnumClass.values():Array:獲取該列舉所有列舉值組成陣列
使用列舉類例項:
EnumClass.列舉值
2、Enum類
前面小結說了,列舉類預設繼承Enum類,列舉類自然就可以使用繼承的屬性、方法
屬性:
name:返回此列舉例項名稱 ordinal:返回列舉值在列舉類中的索引值(第一個列舉值是0…以此類推)
方法: int compareTo(E o):和同型別的列舉例項比較,比較的是列舉值索引,如果該列舉值位於指定列舉物件之前,返回整數,否則返回0
String toString():返回列舉常量名稱
Kotlin1.1開始,提供了兩個泛型方法:
EnumValues():獲取所有列舉值陣列 EnumValueOf(value:String):獲取列舉例項
3、抽象列舉類
抽象列舉類不能使用"abstract"修飾,系統會自動為它新增abstract關鍵字;
我們說過列舉類需要顯示建立列舉值,說以在定義列舉值是需要顯示為抽象成員提供實現; 比如:
enum class Operator{
PLUS {
override fun evl(a: Int, b: Int):Int {
return a+b
}
},
DIV {
override fun evl(a: Int, b: Int):Int {
return a/b
}
},
TIMES {
override fun evl(a: Int, b: Int):Int {
return a*b
}
},MINUS {
override fun evl(a: Int, b: Int):Int {
return a-b
}
};
abstract fun evl(a:Int,b:Int): Int
}
這裡建立PLUS、MINUS列舉值,並不是直接建立Operator列舉類的例項,而是建立其子類的Operator的匿名子類的例項;