375,kotlin的Enum(enum的name和origin
2020-12-15 本文已影响0人
枫叶1234
注意:
kotlin 的enum class
假如value为NSString,如果两个的枚举值的value相等,不是同一个枚举值,因为相同的枚举里边有name和origin,枚举里边不能取相同的名字
1.1.2、枚举常量
枚举类中的每一个枚举常量都是一个对象,并且他们之间用逗号分隔。
/**
* 例:关于一个网络请求结果的枚举类
*/
enum class State{
/*
NORMAL : 正常
NO_DATA : 数据为空
NO_INTERNET : 网络未连接
ERROR : 错误
OTHER : 其他
*/
NORMAL,NO_DATA,NO_INTERNET,ERROR,OTHER
}
1.1.3、访问枚举常量
- 不需要实例化枚举类就可以访问枚举常量
使用方式为:
枚举类名.枚举常量.属性
通过上面例子来实例讲解:
// 使用中缀符号访问枚举常量
State.NORMAL.name
State.NO_DATA.name
State.NO_INTERNET.name
State.ERROR.name
State.OTHER.name
这里只是让大家明白怎样去访问一个枚举常量。没有讲解到枚举常量的使用。枚举常量的使用请大家耐心的看下去。在下面会详细介绍怎样去使用它。
1.2 、枚举常量的初始化
- 因为每一个枚举都是枚举类的实例,所以他们可以是初始化过的。
enum class Color(var argb : Int){
RED(0xFF0000),
WHITE(0xFFFFFF),
BLACK(0x000000),
GREEN(0x00FF00)
}
1.3、枚举常量的匿名类
- 要实现枚举常量的匿名类,则必须提供一个抽象方法(必须重写的方法)。且该方法定义在枚举类内部。而且必须在枚举变量的后面。
- 枚举变量之间使用逗号(,)分割开。但是最后一个枚举变量必须使用分号结束。不然定义不了抽象方法。
- 在上面已经说过,每一个枚举常量就是一个对象。
fun main(args: Array<String>) {
ConsoleColor.BLACK.print()
}
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()
}
输出结果为:
我是枚举常量 BLACK
1.4、枚举类的使用
- 每个枚举常量都包含两个属性:
name
(枚举常量名)和ordinal
(枚举常量位置) - 提供了
values()
和valueOf()
方法来检测指定的名称与枚举类中定义的任何枚举常量是否匹配。 - 自 Kotlin 1.1 起,可以使用
enumValues<T>()
和enumValueOf<T>()
函数以泛型的方式访问枚举类中的常量。
1.4.1、访问枚举变量属性
fun main(args: Array<String>) {
println("name = " + Color.RED.name + "\tordinal = " + Color.RED.ordinal)
println("name = " + Color.WHITE.name + "\tordinal = " + Color.WHITE.ordinal)
println("name = " + Color.BLACK.name + "\tordinal = " + Color.BLACK.ordinal)
println("name = " + Color.GREEN.name + "\tordinal = " + Color.GREEN.ordinal)
}
enum class Color(var argb : Int){
RED(0xFF0000),
WHITE(0xFFFFFF),
BLACK(0x000000),
GREEN(0x00FF00)
}
输出结果为:
name = RED ordinal = 0
name = WHITE ordinal = 1
name = BLACK ordinal = 2
name = GREEN ordinal = 3
1.4.2、使用enumValues<T>()
和 enumValueOf<T>()
访问
例: 枚举类还是上面例子中的Color类
println(enumValues<Color>().joinToString { it.name })
println(enumValueOf<Color>("RED"))
输出结果为:
RED, WHITE, BLACK, GREEN
RED
1.4.3、使用valueOf()
和values()
检测
println(Color.valueOf("RED"))
println(Color.values()[0])
println(Color.values()[1])
println(Color.values()[2])
println(Color.values()[3])
输出结果为:
RED
RED
WHITE
BLACK
GREEN
其中,若使用Color.valueOf("不存在的枚举常量")
,则会抛出IllegalArgumentException
异常,即枚举变量不存在。若使用Color.values()[大于枚举常量位置]
,则会抛出下标越界异常。