目录

Kotlin系列(二十):枚举类


一、前言:

  • 本章节我们将学习Kotlin中的枚举类型。
  • 枚举类型虽然在开发过程中使用的频率不高,但是在一些场景下还是非常好的。
  • 参考资Kotlin官方文档

二、枚举类

  • 枚举类的最基本的用法是实现类型安全的枚举:

      enum class Direction {
      		NORTH, SOUTH, WEST, EAST
      }
    
  • 每个枚举常量都是一个对象。枚举常量用逗号分隔。

  • 也就是 NORTH, SOUTH, WEST, EAST其实都是类Direction的一个实例。


三、枚举类的初始化

  • 因为每一个枚举都是枚举类的实例,所以他们可以是可以按创建实例一样初始化过的:

      enum class Color(val rgb: Int) {
      				RED(0xFF0000),
      				GREEN(0x00FF00),
      				BLUE(0x0000FF)
      }
    

四、匿名类

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

  • 如下我们在枚举类ProtocolState声明一个抽象方法,在枚举类实例里面重写实现。

      enum class ProtocolState {
      		WAITING {
      				override fun signal() = TALKING
      		},
    
      		TALKING {
      				override fun signal() = WAITING
      		};
    
      		abstract fun signal(): ProtocolState
      }
    
  • 及相应的方法、以及覆盖基类的方法。注意,如果枚举类定义任何成员,要使用分号将成员定义中的枚举常量定义分隔开,就像在 Java 中一样。


五、使用枚举常量

  • 就像在 Java 中一样,Kotlin 中的枚举类也有合成方法允许列出定义的枚举常量以及通过名称获取枚举常量。这些方法的签名如下(假设枚举类的名称是 EnumClass):

      EnumClass.valueOf(value: String): EnumClass
      EnumClass.values(): Array<EnumClass>
    
      - 如下,创建一个PersonEnum枚举类
    
      package com.anjie.demo
    
      /**
       * Created by 安杰 on 2017/10/27. */
       enum class PersonEnum(val ename: String) {
      		MEN("男人"), WOMEN("女人")
      }
    
  • 测试代码如下:

      @Test
      fun test4() {
      		val e = PersonEnum.valueOf("MEN");
      		println(e);
      		PersonEnum.values().forEach {
      	println(it);
      		}
      	}
    
  • 结果输出如下:

      MEN
      MEN
      WOMEN
    
  • 注意,valueof并不是我们创建时设置的男人、女人、而是枚举实例的类型。

  • 如果指定的名称与类中定义的任何枚举常量均不匹配,valueOf() 方法将抛出 IllegalArgumentException 异常。

  • 自 Kotlin 1.1 起,可以使用 enumValues<T>()enumValueOf<T>() 函数以泛型的方式访问枚举类中的常量:

  • 测试代码如下:

      @Test
      fun test4() {
      		val e = PersonEnum.valueOf("MEN");
      		println(e);
      		PersonEnum.values().forEach {
      	println(it);
      		}
    
      	val names = enumValues().joinToString { it.name }
      	println(names)
      }
    
  • 结果打印如下:

      MEN
      MEN
      WOMEN
      MEN, WOMEN
    
  • 每个枚举常量都具有在枚举类声明中获取其名称和位置的属性:

      val name: String
      val ordinal: Int
    
  • 我们打印看一下:

  • 测试代码为:

      @Test
      fun test4() {
    
      		PersonEnum.values().forEach {
      	println(it.ename);
      				println(it.name);
      				println(it.ordinal);
    
      		}
    
      }
    
  • 结果打印为:

      男人
      MEN
      0
      女人
      WOMEN
      1
    
  • 枚举常量还实现了 Comparable接口,

  • 其中自然顺序是它们在枚举类中定义的顺序。


六、总结:

  • 本次我们学习了Kotlin的枚举类的定义和使用,比较简单,忘记的时候再看下就好,使用场景不是很多。