前言:前行的路,不怕万人阻挡,只怕自己投降;人生的帆,不怕狂风巨浪,只怕自己没胆量。
一、概述
枚举类最基本的用法是实现类型安全的。枚举类使用 enum 关键字修饰:
enum class Direction {//使用 enum 关键字修饰,在类头 class 前
NORTH, SOUTH, WEST, EAST
}
每一个枚举常数都是一个对象,枚举常量用逗号分隔。
fun test() {
Direction.NORTH
Direction.SOUTH
Direction.WEST
Direction.EAST
}
不需要实例化枚举类就可以访问枚举常量,通过 枚举类.常量名
调用。
因为每一个枚举都是枚举类的一个实例,所以它们可以是初始化过的。
enum class Color(val rgb: Int) {
RED(0xFF0000),
GREEN(0x00FF00),
BLUE(0x0000FF)
}
通过枚举类构造函数,那么每一个枚举都有该构造函数,并且需要初始化值。比如上面的 RED(rgb: Int)
,需要初始化值。
二、枚举常量的匿名类
枚举常量还可以用它们对应的方法声明它们自己的匿名类,以及覆盖基本方法。
enum class ConsoleColor(var argb: Int) {
RED(0xFF0000) {
override fun print() {//必须重写的
println("枚举常量 RED")
}
},
WHITE(0xFFFFFF) {
override fun print() {
println("枚举常量 WHITE")
}
},
BLACK(0x000000) {
override fun print() {
println("枚举常量 BLACK")
}
},//枚举常量之间使用逗号“,”分隔,最后一个常量必须使用分号“;”分隔
GREEN(0x00FF00) {
override fun print() {
println("枚举常量 GREEN")
}
};
abstract fun print()//抽象方法,定义在枚举类内部,而且必须在枚举常量后面
}
- 枚举常量之间使用逗号
,
分隔,如果还定义有任何成员(变量和方法),则使用分号;
将常量定义和成员定义分隔; - 必须提供一个抽象方法,定义在枚举类内部,而且必须在枚举常量后面。
fun test() {
ConsoleColor.BLACK
}
打印数据如下:
枚举常量 BLACK
注意:枚举类不能包含内部类以外的嵌套类型。
三、在枚举类中实现接口
和 Java 一样,Kotlin 的枚举类可以实现接口。一个枚举类可以实现一个接口,为所有枚举常量提供一个接口成员的实现,或者为其匿名类中的每个条目提供单独的接口成员实现。这是通过枚举类声明中添加接口来实现的。如下:
interface ShareListener {
fun invite()
}
enum class State : ShareListener {
NORMAL {
override fun invite() {
println("实现接口 NORMAL")
}
},
ERROR;
override fun invite() {
println("实现接口 enum")
}
}
Kotlin 枚举类可以实现默认的接口方法,枚举类常量成员也可以实现自己的接口方法。优先调用枚举类常量成员实现的方法,枚举类实现的方法次之。
fun test() {
State.NORMAL
State.ERROR
}
打印数据如下:
实现接口 NORMAL
实现接口 enum
四、枚举常量的使用
每个枚举常量都有属性来获取它在枚举类声明中的名称和位置,包括 name(枚举常量名)
和 ordinal(枚举常量位置)
。
enum class State {
NORMAL,
ERROR
}
fun test() {
val normal = State.NORMAL.name //常量名
val normalIndex = State.NORMAL.ordinal //常量下标
val error = State.ERROR.name
val errorIndex = State.ERROR.ordinal
println("枚举常量的使用:name == $normal | ordinal == $normalIndex ")
println("枚举常量的使用:name == $error | ordinal == $errorIndex ")
}
打印数据如下:
枚举常量的使用:name == NORMAL | ordinal == 0
枚举常量的使用:name == ERROR | ordinal == 1
Kotlin 中的枚举类有合成方法,允许列出定义的枚举常量,并通过名称获得枚举常量。这些方法的签名如下:
EnumClass.valueOf(value: String): EnumClass
EnumClass.values(): Array<EnumClass>
如果指定的名称与类中定义的任何枚举常量不匹配,valueOf()
方法将会抛出 IllegalArgumentException 异常;如果 values()
下标位置不匹配,则会抛出下标越界异常。
fun test() {
val normalName = State.valueOf("NORMAL") //指定名称常量
val errorOrdinal = State.values()[1] //指定下标位置常量
println("枚举常量的使用:name == $normalName")
println("枚举常量的使用:name == $errorOrdinal")
}
打印数据如下:
枚举常量的使用:name == NORMAL
枚举常量的使用:name == ERROR
从 Kotlin1.1 开始,就可以使用 enumValues<T>()
和 enumValueOf<T>()
结合泛型的方式来访问枚举类中的常量:
fun test() {
val stateName = enumValues<State>().joinToString { it.name } //打印所有常量
val stateError = enumValueOf<State>("ERROR") //单个常量
println("枚举常量的使用:stateName == $stateName")
println("枚举常量的使用:stateError == $stateError")
}
打印数据如下:
枚举常量的使用:stateName == NORMAL, ERROR
枚举常量的使用:stateError == ERROR
enum常量还实现了 Comparable 接口,其自然顺序是它们在enum类中定义的顺序。
源码地址:/FollowExcellence/KotlinDemo-master
点关注,不迷路
好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是人才。
我是suming,感谢各位的支持和认可,您的点赞就是我创作的最大动力,我们下篇文章见!
如果本篇博客有任何错误,请批评指教,不胜感激 !
要想成为一个优秀的安卓开发者,这里有必须要掌握的知识架构,一步一步朝着自己的梦想前进!Keep Moving!