定义
一个类的对象是有限且固定的,这种实例有限且固定的类称为枚举类。
定义形式
enum class enumName {
....
}
每个枚举常数都是一个枚举类的实例. 枚举常数之间用逗号分隔.
初始化
由于每个枚举值都是枚举类的一个实例, 因此枚举值可以初始化。
enum class Color(val rgb: Int) {
RED(0xFF0000),
GREEN(0x00FF00),
BLUE(0x0000FF)
}
查用API
- EnumClass.valueOf(value: String): 由枚举值的名称获取枚举实例
EnumClass.values(): 获取所有的枚举实例
enum class Person(var type: Int) { STUDENT(1), TEACHER(2), DEAN(3), PRINCIPAL(4) } fun main(args: Array<String>) { val persons: Array<Person> = Person.values() for (per in persons) { println("------------------------------------") println("$per") println("name:${per.name} | ordinal:${per.ordinal} | type: ${per.type} | value: ${Person.valueOf(per.name)}" ) println("------------------------------------") } } // Log STUDENT name:STUDENT | ordinal:0 | type: 1 | value: STUDENT ------------------------------------ TEACHER name:TEACHER | ordinal:1 | type: 2 | value: TEACHER ------------------------------------ DEAN name:DEAN | ordinal:2 | type: 3 | value: DEAN ------------------------------------ PRINCIPAL name:PRINCIPAL | ordinal:3 | type: 4 | value: PRINCIPAL
注:
- 每个枚举常数值都拥有属性, 可以取得它的名称(val name: String), 以及它在枚举类中声明的顺序(val ordinal: Int).
- 枚举类的主构造函数默认是私有的。如果对每个枚举常数设置属性值,需在主构造函数里进行声明,并且在枚举常量处初始化。
匿名类与抽象方法
在枚举类中声明了抽象方法,所有的没有枚举常量都应声明其匿名类,并在匿名类中实现枚举类中声明的抽象方法,如果不实现,编译器会报错。
enum class Person(var type: Int) {
STUDENT(1) {
override fun getPerson(ordinal: Int): Person {
return Person.values()[ordinal]
}
fun doClick() {
println("student do click")
}
},
TEACHER(2) {
override fun getPerson(ordinal: Int): Person {
return Person.values()[ordinal]
}
},
DEAN(3) {
override fun getPerson(ordinal: Int): Person {
return Person.values()[ordinal]
}
},
PRINCIPAL(4) {
override fun getPerson(ordinal: Int): Person {
return Person.values()[ordinal]
}
};
abstract fun getPerson(ordinal: Int): Person
}
// Test
val per = Person.STUDENT
println("getPerson:${per.getPerson(1)}") // 打印:getPerson:TEACHER
注:
- 如果枚举类中定义了任何成员, 你需要用分号将枚举常数的定义与枚举类的成员定义分隔开.
- 匿名内部类中声明的方法,并不能在外部使用,即使是其枚举类型的实例,也不可调用。但重写的枚举类中声明的方法,可以被其实例调用。
枚举类与接口
枚举类实现接口的情况与抽象方法类似,所有的枚举常量都应在其匿名类中实现接口的方法。
enum class Person(var type: Int): IClickListener{
STUDENT(1) {
override fun doClick() {
println("do click")
}
},
TEACHER(2) {
override fun doClick() {
println("do click")
}
},
DEAN(3) {
override fun doClick() {
println("do click")
}
},
PRINCIPAL(4) {
override fun doClick() {
println("do click")
}
};
}