枚举
1、枚举类
Kotlin中也有枚举,而且是仅此唯一一个定义比Java“复杂”的结构。Java中定义一个枚举只需要enum关键字,Kotlin中需要enum class两个一起才行。
1.1、定义枚举类
定义类时用enum软关键字声明这个类是一个枚举类。为什么叫软关键字,因为Kotlin中enum只有和class在一起才有用,其它时候可以作为变量名使用。关键字是不可以作为变量名的,比如class,可以用clazz或aClass名替代。

例:
enum class Fruit {
APPLE,
BANANA,
GRAPE,
LEMON,
OLIVE;
}1.2、枚举构造器
可以给枚举定义有参数的构造器,枚举类中的每个枚举实例都需要调用构造器才能初始化。
例:
enum class Fruit(var num: Int) {//同时还定义了一个num成员
APPLE(1),
BANANA(2),
GRAPE(3),
LEMON(4),
OLIVE(5);
}定义COLOR颜色枚举
enum class COLOR(val red: Int, val green: Int, val blue: Int) {
RED(255, 0, 0), ORANGE(255, 1165, 0), YELLOW(255, 255, 0),
GREEN(0, 255, 0), BLUE(0, 0, 255), VIOLET(238, 130, 238);
}2、隐藏的方法
枚举类具有合成方法,允许遍历定义的枚举常量,并通过其名称获取枚举常数。
2.1、values()
获取枚举类中的所有枚举值。
例:
//打印Fruit枚举类中的所有枚举值
for (value in Fruit.values()) {
println(value)
}2.2、valueOf(value:String)
将指定String类型的枚举名称转换为枚举类中的枚举值
enum class Fruit(var num: Int) {
APPLE(1),
}
//获取名称为"APPLE"的枚举值
var en = Fruit.valueOf("APPLE")注意,如果传入的String名称错误,不存在该枚举值,则会抛出IllegalArgumentException异常。
Exception in thread "main" java.lang.IllegalArgumentException: No enum constant main.Fruit.APP1LE
at java.lang.Enum.valueOf(Enum.java:238)
at main.Fruit.valueOf(HelloKotlin.kt)
at main.HelloKotlinKt.main(HelloKotlin.kt:6)
3、定义方法
枚举类中可以定义方法。要在枚举中定义方法,就要使用封号 ;把枚举常量列表和方法定义分开。这是Kotlin中唯一用到封号的地方!
例:
enum class Fruit(var num: Int) {
APPLE(1),
BANANA(2),
GRAPE(3),
LEMON(4),
OLIVE(5);
fun getType(): Int {
return num
}
}每个枚举实现可以重写枚举类中的方法,当然前提是定义为open方法。
例:
enum class Fruit(var num: Int) {
APPLE(1) {
//APPLE枚举重写覆盖方法
override fun getType(): Int {
return num * num
}
};
//枚举类中定义公共的方法
open fun getType(): Int {
return num
}
}方法还可以是抽象的,这样需要每个枚举实例都去实现该方法。
例:
enum class Fruit(var num: Int) {
APPLE(1) {
//每个枚举对象都需要实现枚举类中的抽象方法
override fun getType(): Int {
return num
}
};
//枚举类中定义的抽象方法
abstract fun getType(): Int
}学习资料:

