從零開始學Kotlin-枚舉(9)
阿新 • • 發佈:2018-01-30
emc roi 實例 list cnblogs 外部 listener ring 枚舉
從零開始學Kotlin基礎篇系列文章
枚舉的定義
- 一個類的對象是有限且固定的,這種實例有限且固定的類稱為枚舉類;
枚舉常量用逗號分隔,每個枚舉常量都是一個對象;
enum class EnumDemo9 { RED, BLUE, BLACK, WHITE }
枚舉初始化
每一個枚舉都是枚舉類的實例,它們可以被初始化;枚舉類的主構造函數默認是私有的,初始化時需要在主構造函數中聲明;
enum class EnumDemo91(val rgb: Int) { RED(0xff0000), BLUE(0x0011ff), BLACK(0x000000), WHITE(0xffffff), }
枚舉的使用
- EnumClass.valueOf(value: String): 由枚舉值的名稱獲取枚舉實例;未匹配成功,會拋出IllegalArgumentException
EnumClass.values(): 以數組的形式,獲取所有的枚舉實例
fun main(args: Array<String>) { var colors: Array<EnumDemo91> = EnumDemo91.values() var redColor = EnumDemo91.valueOf("RED") }
- 每個枚舉常數值都擁有屬性,獲取枚舉相關信息:
- val name: String //獲取枚舉名稱
val ordinal: Int //獲取枚舉值在所有枚舉數組中定義的順序
fun main(args: Array<String>) { val redColor = EnumDemo91.valueOf("RED") var redColorName = redColor.name var redColorOrdinal = redColor.ordinal }
自 Kotlin 1.1 起,可以使用 enumValues
print(enumValues<EnumDemo91>().joinToString { it.name })//輸出:RED,BLUE,BLACK,WHITE print(enumValueOf<EnumDemo91>("RED"))//輸出:RED
枚舉類與接口
枚舉類實現接口的情況與抽象方法類似,所有的枚舉常量都應在其匿名類中實現接口的方法。
//定義一個接口 interface ItemClickListener { fun onClick(msg: String) } //枚舉類繼承接口 enum class EnumDemo92 : ItemClickListener { BUTTON { override fun onClick(msg: String) { print(msg) } }, IMAGE { override fun onClick(msg: String) { print(msg) } } }
匿名類與抽象方法
枚舉還支持以聲明自己的匿名類及相應的方法、以及覆蓋基類的方法;
- 在枚舉類中聲明了抽象方法,所有的枚舉常量都應聲明其匿名類,並在匿名類中實現枚舉類中聲明的抽象方法,如果不實現,編譯器會報錯;
- 如果枚舉類定義任何成員,要使用分號將成員定義中的枚舉常量定義分隔開;
- 匿名內部類中聲明的方法,並不能在外部使用,即使是其枚舉類型的實例,也不可調用;但重寫的枚舉類中聲明的方法,可以被其實例調用;
enum class Person(var code: Int) {
NAME1(0) {
override fun showName(name: String): Person {
return Person.values()[0]
}
},
NAME2(1) {
override fun showName(name: String): Person = NAME2
};
abstract fun showName(name: String): Person
}
從零開始學Kotlin-枚舉(9)