7.7 枚举类

Kotlin的枚举类定义如下:

  1. public abstract class Enum<E : Enum<E>>(name: String, ordinal: Int): Comparable<E> {
  2. companion object {}
  3. public final val name: String
  4. public final val ordinal: Int
  5. public override final fun compareTo(other: E): Int
  6. protected final fun clone(): Any
  7. public override final fun equals(other: Any?): Boolean
  8. public override final fun hashCode(): Int
  9. public override fun toString(): String
  10. }

我们可以看出,这个枚举类有两个属性:

  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. }
  4. >>> val north = Direction.NORTH
  5. >>> north.name
  6. NORTH
  7. >>> north.ordinal
  8. 0
  9. >>> north is Direction
  10. true

每个枚举常量都是一个对象。枚举常量用逗号分隔。

7.7.2 初始化枚举值

我们可以如下初始化枚举类的值:

  1. enum class Color(val rgb: Int) {
  2. RED(0xFF0000),
  3. GREEN(0x00FF00),
  4. BLUE(0x0000FF)
  5. }
  6. >>> val red = Color.RED
  7. >>> red.rgb
  8. 16711680

另外,枚举常量也可以声明自己的匿名类:

  1. enum class ActivtyLifeState {
  2. onCreate {
  3. override fun signal() = onStart
  4. },
  5. onStart {
  6. override fun signal() = onStop
  7. },
  8. onStop {
  9. override fun signal() = onStart
  10. },
  11. onDestroy {
  12. override fun signal() = onDestroy
  13. };
  14. abstract fun signal(): ActivtyLifeState
  15. }
  16. >>> val s = ActivtyLifeState.onCreate
  17. >>> println(s.signal())
  18. 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 }
  2. >>> val rgbs = enumValues<RGB>().joinToString { "${it.name} : ${it.ordinal} " }
  3. >>> rgbs
  4. 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. }
  6. >>> val colors = enumValues<Color>().joinToString { "${it.rgb} : ${it.name} : ${it.ordinal} " }
  7. >>> colors
  8. 16711680 : RED : 0 , 65280 : GREEN : 1 , 255 : BLUE : 2

然后,我们可以直接使用it.rgb访问属性名来得到对应的属性值。