枚举类最基本的用法是实现一个类型安全的枚举(typesafe enum),什么叫做类型安全的枚举呢,即每个枚举都是枚举类的实例且不提供公共的构造方法。
enum class Color{
RED, GREEN, BLUE, WHITE, BLACK
}
枚举类使用关键字enum
标记,enum
关键字在类头中的class
关键字前面。
enum class 类名{
...
}
枚举常量
- 枚举常量是指枚举类下的对象,每个枚举类包含0到多个枚举常量。
- 枚举常量使用逗号分隔,每个枚举常量都是一个对象。
- 枚举类中的每个枚举常量都是一个对象,枚举常量之间使用逗号分隔。
- 枚举常量也可以被定义在自己的匿名类中
- 每个枚举都是枚举类的实例,都可以被初始化。
根据枚举值的名称获取枚举实例
EnumClass.valueOf(value:String)
获取所有枚举实例
EnumClass.values()
例如:
//定义枚举类
enum class LogLevel{
VERBOSE, DEBUG, INFO, WARN, ERROR, ASSERT
}
//测试运行
fun main(args:Array<String>){
val level:LogLevel = LogLevel.DEBUG
println(level.name)//DEBUG
println(level.ordinal)//1
println(LogLevel.values())//[LLogLevel;@6e8cf4c6
println(LogLevel.valueOf("ERROR"))//ERROR
println(LogLevel.ERROR)//ERROR
println(LogLevel.ERROR.ordinal)//4
println(LogLevel.ERROR.name)//ERROR
}
- 每个枚举常量都拥有属性,可以获取它的名称
name
以及它在枚举类中声明的顺序ordinal
。 - 枚举类的著构造函数默认是私有的,若对枚举常量设置属性值,需在主构造函数会中进行声明,并且在枚举常量处进行初始化。
例如:
//定义枚举类
enum class LogLevel(var type:Int){
VERBOSE(1),
DEBUG(2),
INFO(3),
WARN(4),
ERROR(5),
ASSERT(6)
}
//测试运行
fun main(args:Array<String>){
val levels:Array<LogLevel> = LogLevel.values()
for(item in levels){
println("name:${item.name} ordinal:${item.ordinal} type:${item.type} value:${LogLevel.valueOf(item.name)}")
}
}