7.7 枚举类
Kotlin的枚举类定义如下:
public abstract class Enum<E : Enum<E>>(name: String, ordinal: Int): Comparable<E> {
companion object {}
public final val name: String
public final val ordinal: Int
public override final fun compareTo(other: E): Int
protected final fun clone(): Any
public override final fun equals(other: Any?): Boolean
public override final fun hashCode(): Int
public override fun toString(): String
}
我们可以看出,这个枚举类有两个属性:
public final val name: String
public final val ordinal: Int
分别表示的是枚举对象的值跟下标位置。
同时,我们可以看出枚举类还实现了Comparable
7.7.1 枚举类基本用法
枚举类的最基本的用法是实现类型安全的枚举:
enum class Direction {
NORTH, SOUTH, WEST, EAST
}
>>> val north = Direction.NORTH
>>> north.name
NORTH
>>> north.ordinal
0
>>> north is Direction
true
每个枚举常量都是一个对象。枚举常量用逗号分隔。
7.7.2 初始化枚举值
我们可以如下初始化枚举类的值:
enum class Color(val rgb: Int) {
RED(0xFF0000),
GREEN(0x00FF00),
BLUE(0x0000FF)
}
>>> val red = Color.RED
>>> red.rgb
16711680
另外,枚举常量也可以声明自己的匿名类:
enum class ActivtyLifeState {
onCreate {
override fun signal() = onStart
},
onStart {
override fun signal() = onStop
},
onStop {
override fun signal() = onStart
},
onDestroy {
override fun signal() = onDestroy
};
abstract fun signal(): ActivtyLifeState
}
>>> val s = ActivtyLifeState.onCreate
>>> println(s.signal())
onStart
7.7.3 使用枚举常量
我们使用enumValues()函数来列出枚举的所有值:
@SinceKotlin("1.1")
public inline fun <reified T : Enum<T>> enumValues(): Array<T>
每个枚举常量,默认都name
名称和ordinal
位置的属性(这个跟Java的Enum类里面的类似):
val name: String
val ordinal: Int
代码示例:
enum class RGB { RED, GREEN, BLUE }
>>> val rgbs = enumValues<RGB>().joinToString { "${it.name} : ${it.ordinal} " }
>>> rgbs
RED : 0 , GREEN : 1 , BLUE : 2
我们直接声明了一个简单枚举类,我们使用遍历函数enumValues<RGB>()
列出了RGB枚举类的所有枚举值。使用it.name
it.ordinal
直接访问各个枚举值的名称和位置。
另外,我们也可以自定义枚举属性值:
enum class Color(val rgb: Int) {
RED(0xFF0000),
GREEN(0x00FF00),
BLUE(0x0000FF)
}
>>> val colors = enumValues<Color>().joinToString { "${it.rgb} : ${it.name} : ${it.ordinal} " }
>>> colors
16711680 : RED : 0 , 65280 : GREEN : 1 , 255 : BLUE : 2
然后,我们可以直接使用it.rgb
访问属性名来得到对应的属性值。
当前内容版权归 JackChan1999 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 JackChan1999 .