Kotlin枚举类

时间:2020-02-23 14:37:30  来源:igfitidea点击:

在本教程中,我们将研究Kotlin枚举类。
它们与Java枚举有何不同?我们将详细讨论您需要了解的有关Kotlin枚举类的所有信息。

Kotlin枚举类

Kotlin中的枚举是保存一组常量的数据类型。
枚举是通过在类的前面添加修饰符" enum"来定义的,如下所示。
是的,在Kotlin中,Enums是类。

enum class Months{
  January,
  February,
  March
}

以下是有关Kotlin中的枚举类的一些要点。

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

  • 每个枚举常量都充当该类的单独实例。

  • 枚举对增强代码的可读性很有用,因为它为常量分配了预定义的名称。

  • 与类不同,枚举类的实例不能使用构造函数创建。

  • 因此,我们可以断言枚举类是抽象的。

让我们看看如何在类的" main"函数中初始化枚举类。

fun main(args: Array<String>) {

  println(Months.January) //prints January
  println(Months.values().size) //prints 3
  println(Months.valueOf("March")) //prints March

  for (enum in Months.values()) {
      println(enum.name)
  }

  println(Months.valueOf("Mar")) //throws java.lang.IllegalArgumentException: No enum constant Months.Mar
}

上面的代码很少有推断:

  • " values()"以数组的形式返回枚举常量,我们可以在该数组上进行迭代以检索每个枚举常量。

  • " valueOf()"用于使用字符串作为参数来获取枚举常量。

  • 如果该值与任何常量都不匹配,则将引发运行时异常。

让我们看看如何解决这种情况。

fun enumContains(name: String): Boolean {
  return enumValues<Months>().any { it.name == name }
}

fun main(args: Array<String>) {

  if (enumContains("")) {
      println(Months.valueOf(""))
  } else {
      println("The string value does not match with any of the enum constants.") //this gets printed.
  }

}

enumContainsis a function that calls the lambda function any which iterates over the enum constants to check if any of them matches the string and returns a boolean.

枚举属性

每个枚举常量都有属性:name,ordinal以获取常量的名称和位置。

fun main(args: Array<String>) {
  
  println(Months.January.name) //prints January
  println(Months.March.ordinal) //prints 2
  for (enum in Months.values()) {
      println(enum.name)
  }
}

枚举toString()

我们可以在枚举类中重写toString()函数,如下所示。

enum class Months {
  January,
  February,
  March;

  override fun toString(): String {
      return super.toString().toUpperCase()
  }
}

fun main(args: Array<String>) {
  println(Months.January) //prints JANUARY
  println(Months.January.name) //prints January
   println(Months.valueOf("March")) //prints MARCH
}

枚举是类。
因此,除了定义常量之外,我们还可以定义类中可以存在的其他内容。
为此,我们需要首先以半冒号结束枚举部分。
注意:Month.January调用该类的toString()方法,而Month.January.name直接打印该枚举常量的名称。

枚举初始化

枚举常量可以使用主要构造函数进行初始化,如下所示。

enum class Months(var shorthand: String) {
  January("JAN"),
  February("FEB"),
  March("MAR");
}

fun main(args: Array<String>) {

  var x = Months.January
  println(x.shorthand) //prints JAN
  x.shorthand = "Shorthand changed to J."
  println(Months.January.shorthand) //prints Shorthand changed to J.
}

枚举作为匿名类

枚举常量的行为就像匿名类正在实现其自身的功能以及从该类覆盖基本函数一样,如下所示。

enum class Months(var shorthand: String) {
  January("JAN"){
      override fun printSomething() {
          println("First month of the year.")
      }
  },
  February("FEB"){
      override fun printSomething() {
          println("Second month of the year.")
      }
  },
  March("MAR"){
      override fun printSomething() {
          println("Third month of the year.")
      }
  };
  var a: String = "Hello, Kotlin Enums"
  abstract fun printSomething()
}

fun main(args: Array<String>) {
  Months.February.printSomething() //prints Second month of the year.
  println(Months.February.a) //prints Hello, Kotlin Enums
}

每个枚举常量都必须重写

枚举内的枚举

如下所示,可以在当前枚举类中定义另一个枚举类。

enum class Months {
  January,
  February,
  March;

  enum class Day{
      Monday,
      Tuesday,
      Wednesday
  }
}

fun main(args: Array<String>) {
  println(Months.Day.Tuesday) //prints Tuesday
}

只有一个枚举类可以调用另一个。
内部类" Day"不能从枚举常量中调用。

枚举以及何时

" when"等效于Java中的switch的Kotlin。
我们已经在"控制流"教程中介绍了它的工作原理。
下面给出一个示例,说明如何将语句与枚举一起使用。

enum class Months {
  January,
  February,
  March;
}

fun main(args: Array<String>) {

  var m = Months.February

  when (m) {
      Months.January  -> print("Matches with Jan")
      Months.February -> print("Matches with Feb") //prints this.
      Months.March -> print("Matches with Mar")
  }
}