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.6.1 枚举类基本用法
枚举类的最基本的用法是实现类型安全的枚举:
enum class Direction {
NORTH, SOUTH, WEST, EAST
}
>>> val north = Direction.NORTH
>>> north.name
NORTH
>>> north.ordinal
0
>>> north is Direction
true
每个枚举常量都是一个对象。枚举常量用逗号分隔。
7.6.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.6.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访问属性名来得到对应的属性值。