1.概念
與Java一樣,枚舉類是一種特殊的類,kotlin可以通過enum class關鍵字定義枚舉類。
2.注意點
- 枚舉類可以實現0~N個接口;
- 枚舉類默認繼承於kotlin.Enum類(其他類最終父類都是Any),因此kotlin枚舉類不能繼承類;
- 非抽象枚舉類不能用open修飾符修飾,因此非抽象枚舉類不能派生子類;
- 抽象枚舉類不能使用abstract關鍵字修飾enum class,抽象方法和抽象屬性需要使用;
- 枚舉類構造器只能使用private修飾符修飾,若不指定,則默認為private;
- 枚舉類所有實例在第一行顯式列出,每個實例之間用逗號隔開,整個聲明以分號結尾;
- 枚舉類是特殊的類,也可以定義屬性、方法、構造器;
- 枚舉類應該設置成不可變類,即屬性值不允許改變,這樣更安全;
- 枚舉屬性設置成只讀屬性后,最好在構造器中為枚舉類指定初始值,如果在聲明時為枚舉指定初始值,會導致所有枚舉值(或者說枚舉對象)的該屬性都一樣。
3.定義枚舉類
/**
* 定義一個枚舉類
* 定義枚舉類接口,接口給只讀屬性復制
*/
enum class EnumClass(val enumParam: String) {
MON("星期一"), TUES("星期二"), WED("星期三");//逗號隔開,分號結尾
/**
* 枚舉類方法
*/
fun enumFun() {
println("枚舉值:$this 枚舉屬性:$enumParam")
}
}
fun main(args: Array<String>) {
println(EnumClass.MON)//獲取枚舉值,此處相當於調用枚舉值的toString 結果:MON
println(EnumClass.MON.name)//獲取枚舉值的名字,相當於枚舉值調用toString 結果:MON
println(EnumClass.MON.enumParam)//獲取枚舉屬性 結果:星期一
EnumClass.MON.enumFun()//調用枚舉方法 結果:枚舉值:MON 枚舉屬性:星期一
println(EnumClass.valueOf("MON"))//通過枚舉字符串名獲取枚舉值,EnumClass.valueOf("MON")<=>EnumClass.MON 結果:MON
println(EnumClass.valueOf("MON").enumParam)//獲取該枚舉值的屬性 結果:星期一
EnumClass.valueOf("MON").enumFun()//調用該枚舉值的方法 結果:枚舉值:MON 枚舉屬性:星期一
println(EnumClass.values().joinToString { it.name })//獲取該枚舉值所有枚舉值組成的數組並打印出枚舉名 結果:MON, TUES, WED
println(EnumClass.MON.ordinal)//獲取枚舉值在枚舉類中定義位置 結果:0
println(enumValueOf<EnumClass>("MON"))//通過枚舉值名字獲取枚舉值<=>EnumClass.valueOf("MON")<=>EnumClass.MON 結果:MON
println(enumValues<EnumClass>().joinToString { it.name })//獲取指定枚舉所有枚舉值<=>EnumClass.values() 結果:MON, TUES, WED
}
4.枚舉類實現接口
(1)方式一:枚舉值分別實現接口的抽象成員
/**
* 定義一個枚舉類
* 定義枚舉類接口,接口給只讀屬性復制
*/
enum class EnumClass(val enumParam: String) : EnumInterface {
MON("星期一") {
override fun interfaceFun() {
println(enumParam)
}
override val interfaceParam: String
get() = "1"
},
TUES("星期二") {
override fun interfaceFun() {
println(enumParam)
}
override val interfaceParam: String
get() = "2"
},
WED("星期三") {
override fun interfaceFun() {
println(enumParam)
}
override val interfaceParam: String
get() = "3"
};//逗號隔開,分號結尾
}
fun main(args: Array<String>) {
EnumClass.MON.interfaceFun()//調用枚舉對象實現的抽象方法 結果:星期一
println(EnumClass.MON.interfaceParam)//調用枚舉對象實現的抽象屬性 結果:1
}
interface EnumInterface {
fun interfaceFun()
val interfaceParam : String
}
(2)方式二:枚舉類統一實現接口的抽象成員
/**
* 定義一個枚舉類
* 定義枚舉類接口,接口給只讀屬性復制
*/
enum class EnumClass(val enumParam: String) : EnumInterface {
MON("星期一"),
TUES("星期二"),
WED("星期三");//逗號隔開,分號結尾
override fun interfaceFun() {
println("統一實現的接口的抽象方法")
}
override val interfaceParam: String
get() = "統一實現的抽象屬性"
}
fun main(args: Array<String>) {
EnumClass.MON.interfaceFun()//調用枚舉對象實現的抽象方法 結果:統一實現的接口的抽象方法
println(EnumClass.MON.interfaceParam)//調用枚舉對象實現的抽象屬性 結果:統一實現的抽象屬性
}
interface EnumInterface {
fun interfaceFun()
val interfaceParam: String
}
5.抽象枚舉類
只能通過枚舉值分別實現抽象枚舉類抽象成員
/**
* 抽象枚舉類
*/
enum class AbstractEnumClass {
MON {
override val abstractParam: String
get() = "星期一"
override fun abstractFun() {
println(abstractParam)
}
},
TUES {
override val abstractParam: String
get() = "星期二"
override fun abstractFun() {
println(abstractParam)
}
},
WED {
override val abstractParam: String
get() = "星期三"
override fun abstractFun() {
println(abstractParam)
}
};
abstract val abstractParam: String
abstract fun abstractFun()
}
fun main(args: Array<String>) {
AbstractEnumClass.MON.abstractFun()//調用枚舉對象實現的抽象方法 結果:星期一
println(AbstractEnumClass.MON.abstractParam)//調用枚舉對象實現的抽象屬性 結果:星期一
}