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访问属性名来得到对应的属性值。