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