如何在Kotlin中创建枚举常量(附实例)

210 阅读2分钟

枚举(或简称enum)是一个命名的定义常量列表,你可以在程序中使用它来存储具有某些值的任意类型。

在Kotlin中,你可以通过创建一个特殊的enum class ,它可以有属性、实现接口和创建匿名类,来创建枚举常量。

要在Kotlin中创建一个枚举,你需要定义一个enum class ,如下图所示:

enum class CarType {
TESLA,
FORD,
HONDA
}

而这就是你创建一个基本枚举所需要做的。你可以把其中一个枚举值分配给一个变量,如下所示:

val myCar = CarType.TESLA

带有属性的Kotlin枚举

接下来,你还可以为每个枚举值添加属性,方法是在enum class ,定义你希望这些值拥有的属性的构造函数。

下面的例子为枚举值添加了color: String 属性:

enum class CarType(val color: String) {
TESLA("Black"),
FORD("Blue"),
HONDA("Grey")
}
println("My car color is ${CarType.FORD.color}")
// My car color is Blue

你可以根据需要为你的枚举值添加尽可能多的属性。

Kotin枚举作为匿名类。

你也可以从枚举值中创建匿名类。

要做到这一点,你需要把每个枚举转化为一个有自己方法的类。

你还需要为类的方法提供基础方法(要么是abstract ,要么是open 函数)。

请看下面的例子,注意start() 方法是如何被添加到enum class 的主体中的:

enum class CarType {
TESLA {
override fun start() {
println("Tesla ready to race..")
}
},
FORD {
override fun start() {
println("Ford revving the engine..")
}
},
HONDA;
open fun start() {
print("The car is starting..")
}
}
CarType.HONDA.start() // The car is starting..
CarType.FORD.start() // Ford revving the engine

基准方法open fun start() 被定义在CarType 体内,而每个枚举值都可以自由地在自己的匿名类体中override 该方法。

Kotlin枚举实现接口

最后,一个enum class ,也可以像普通类一样实现一个interface

这样,你的每个枚举值都将是一个实现接口方法的匿名类。

例如,让我们创建一个CarYear 接口,有一个getManufactureYear() 方法,返回一个Int 值:

interface CarYear {
fun getManufactureYear(): Int
}

接下来,将CarYear 接口实现到CarType 类中。

然后你需要在每个枚举值中为getManufactureYear() 方法提供override fun :

enum class CarType: CarYear {
TESLA {
override fun getManufactureYear() = 2020
},
FORD {
override fun getManufactureYear() = 2019
},
HONDA {
override fun getManufactureYear() = 2018
};
}

另外,你也可以提供一个接口方法的默认实现,如下图所示:

enum class CarType: CarYear {
TESLA {
override fun getManufactureYear() = 2020
},
FORD {
override fun getManufactureYear() = 2019
},
HONDA;
override fun getManufactureYear() = 2018
}
CarType.HONDA.getManufactureYear() // 2018

这就是你如何在Kotlin中把一个interface 实现为一个enum class 类型。

总而言之,Kotlin中的枚举比传统语言中的枚举更复杂一些。

Kotlin中的枚举被定义在一个特殊的enum class 。你可以添加属性,创建匿名类,并实现接口。