📜  Kotlin 中的枚举类

📅  最后修改于: 2022-05-13 01:54:46.289000             🧑  作者: Mango

Kotlin 中的枚举类

在编程中,有时需要一个类型只有某些值。为此,引入了枚举的概念。枚举是一个命名的常量列表。
在 Kotlin 中,与许多其他编程语言一样,枚举具有自己的特殊类型,表示某事物具有许多可能的值。与Java枚举不同,Kotlin 枚举是

关于 kotlin 中枚举类的一些要点——

  • 枚举常量不仅仅是常量的集合——它们具有属性、方法等
  • 每个枚举常量都充当类的单独实例,并用逗号分隔。
  • 枚举通过为常量分配预定义的名称来提高代码的可读性。
  • 无法使用构造函数创建枚举类的实例。

枚举是通过在类前面使用enum关键字定义的,如下所示:-

enum class DAYS{
  SUNDAY,
  MONDAY,
  TUESDAY,
  WEDNESDAY,
  THURSDAY,
  FRIDAY,
  SATURDAY
}

初始化枚举——

在 Kotlin 中,枚举也可以具有类似Java枚举的构造函数。由于枚举常量是 Enum 类的实例,因此可以通过将特定值传递给主构造函数来初始化常量。

这是一个为卡片指定颜色的示例 -

enum class Cards(val color: String) {
    Diamond("black"),
    Heart("red"),
}

我们可以使用以下方法轻松访问卡片的颜色 -

val color = Cards.Diamond.color

枚举属性和方法——

与Java和其他编程语言一样,Kotlin 枚举类具有一些可供程序员使用的内置属性和函数。下面看一下主要的属性和方法。

特性 -

  1. ordinal:此属性存储常量的序数值,通常是从零开始的索引。
  2. name:此属性存储常量的名称。

方法 -

  1. values :此方法返回枚举类中定义的所有常量的列表。
  2. valueOf :此方法返回 enum 中定义的枚举常量,与输入字符串匹配。如果枚举中不存在常量,则抛出 IllegalArgumentException。

在 Kotlin 中演示枚举类的示例 -

enum class DAYS {
    SUNDAY,
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY
}
fun main()
{
    // A simple demonstration of properties and methods
    for (day in DAYS.values()) {
        println("${day.ordinal} = ${day.name}")
    }
    println("${DAYS.valueOf(" WEDNESDAY ")}")
}

输出:

0 = SUNDAY
1 = MONDAY
2 = TUESDAY
3 = WEDNESDAY
4 = THURSDAY
5 = FRIDAY
6 = SATURDAY
WEDNESDAY

枚举类属性和函数——

由于 Kotlin 中的 enum 类,定义了一个新类型。此类类型可以有自己的属性和功能。属性可以被赋予一个默认值,但是,如果没有提供,那么每个常量都应该为属性定义自己的值。在函数的情况下,它们通常在伴随对象中定义,因此它们不依赖于类的特定实例。但是,它们也可以在没有伴随对象的情况下定义。

演示 Kotlin 中的属性和函数的示例

// A property with default value provided
enum class DAYS(val isWeekend: Boolean = false){
    SUNDAY(true),
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    // Default value overridden
    SATURDAY(true);
   
    companion object{
        fun today(obj: DAYS): Boolean {
            return obj.name.compareTo("SATURDAY") == 0 || obj.name.compareTo("SUNDAY") == 0
        }
    }
}
   
fun main(){
    // A simple demonstration of properties and methods
    for(day in DAYS.values()) {
        println("${day.ordinal} = ${day.name} and is weekend ${day.isWeekend}")
    }
    val today = DAYS.MONDAY;
    println("Is today a weekend ${DAYS.today(today)}")
}

输出:

0 = SUNDAY and is weekend true
1 = MONDAY and is weekend false
2 = TUESDAY and is weekend false
3 = WEDNESDAY and is weekend false
4 = THURSDAY and is weekend false
5 = FRIDAY and is weekend false
6 = SATURDAY and is weekend true
Is today a weekend false

枚举作为匿名类 –

枚举常量还通过实现自己的函数以及覆盖类的抽象函数来充当匿名类。最重要的是每个枚举常量都必须被覆盖。

// defining enum class
enum class Seasons(var weather: String) {
    Summer("hot"){
        // compile time error if not override the function foo()
        override fun foo() {              
            println("Hot days of a year")
        }
    },
    Winter("cold"){
        override fun foo() {
            println("Cold days of a year")
        }
    },
    Rainy("moderate"){
        override fun foo() {
            println("Rainy days of a year")
        }
    };
    abstract fun foo()
}
// main function
fun main(args: Array) {
    // calling foo() function override be Summer constant
    Seasons.Summer.foo() 
}

输出:

Hot days of a year

枚举类when表达式的用法 -

当 Kotlin 中的枚举类与 when 表达式结合使用时,它们的一个巨大优势就会发挥作用。优点是因为枚举类限制了一个类型可以取的值,所以当与 when 表达式一起使用并且提供了所有常量的定义时,就完全不需要 else 子句了。事实上,这样做会从编译器生成警告。

enum class DAYS{
    SUNDAY,
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY;
}
   
fun main(){
    when(DAYS.SUNDAY){
        DAYS.SUNDAY -> println("Today is Sunday")
        DAYS.MONDAY -> println("Today is Monday")
        DAYS.TUESDAY -> println("Today is Tuesday")
        DAYS.WEDNESDAY -> println("Today is Wednesday")
        DAYS.THURSDAY -> println("Today is Thursday")
        DAYS.FRIDAY -> println("Today is Friday")
        DAYS.SATURDAY -> println("Today is Saturday")
        // Adding an else clause will generate a warning
    }
}

输出:

Today is Sunday