Kotlin - 枚举类 enum

定义 

声明枚举类使用 enum 关键字。虽然是类但不能创建实例,只能通过类名调用类中定义的枚举常量,每一个枚举常量就是一个该枚举类的实例。

.oridinal

枚举常量在类中的索引,从0开始。不存在就报错:ArrayIndexOutOfBoundsException。

compareTo(  )

A.compareTo( B )

比较两个枚举常量的索引,A优先返回-1,相等返回0,A落后返回1。

.name

toString( )

枚举常量的名称。

values( )

valueof( )

获取所有枚举常量,返回一个数组。

通过枚举常量的名称获取对应枚举常量。不存在就报错:IllegalArgumentException。

enumValues<T>( )

enumValueOf<T>( )

同上,1.1版本起支持以泛型的方式访问。
getDeclaringClass( )通过枚举常量获取枚举类。
enum class Demo {
    //可以是小写,常量规范用大写
    RED, BLUE, YELLOW, GREEN
}

println(Demo.BLUE.ordinal)  //打印:1
println(Demo.BLUE.name)     //打印:BLUE
//如果 GREEN 不存在,报错:IllegalArgumentException
val aa = Demo.valueOf("GREEN")  //aa就是GREEN这个常量,类型是Demo,还不如就用类名调用
val bb = enumValueOf<Demo>("GREEN") //泛型访问方式
//拿到的是YELLOW,角标超过枚举常量数量报错:ArrayIndexOutOfBoundsException
val cc = Demo.values()[2]    //函数返回数组,因此可直接获取元素
Demo.values().forEach { print("$it,") }    //打印:RED,BLUE,YELLOW,GREEN,
enumValues<Demo>().forEach { print("$it,") }    //泛型访问方式

枚举常量初始化 

  • 每个枚举常量都是该枚举类的实例,可以定义枚举类的主构造进行初始化,枚举常量彼此之间用逗号分隔。声明枚举常量的时候就是在做初始化。
  • 可以声明属性或函数,但需要在最后一个枚举常量的后面使用分号 ; 隔开。
enum class Demo(var str: String, var age: Int) {
    RED("张三", 18),
    BLUE("李四", 22),
    YELLOW("王五", 15);   //后面定义属性或函数需要使用分号隔开
    var gender: Boolean = false
    fun show() = println(str + age)
}

println(Demo.BLUE.str)     //打印:李四
println(Demo.BLUE.age)     //打印:22
Demo.RED.show()     //打印:张三18
println(Demo.RED.gender)    //打印:false

枚举常量的匿名类

枚举常量类体中不管是声明属性还是函数,都需要先在枚举类中定义成open或者abstract,然后去复写。毕竟枚举常量是枚举类的实例。

enum class Demo {
    RED {
        override var str = "RED,str"
        override fun show() { println("RED,show") }
        override fun method() { println("RED,method") }
    };

    abstract fun show()
    open fun method() { println("Demo,method") }
    open var str: String = "Demo,str"
}

实现接口

可以在类中统一进行覆盖,枚举常量自行进行覆盖。

interface AA { fun showAA() }
interface BB { fun showBB() }

enum class Demo : AA, BB {
    RED {
        //覆盖掉统一覆盖,用自己的
        override fun showAA() { println("RED,showBB") }
        //未统一覆盖的,需要自己覆盖
        override fun showBB() { println("RED,showBB") }
    },
    BLUE {
        //未统一覆盖的,需要自己覆盖
        override fun showBB() { println("BLUE,showBB") }
    };
    //统一覆盖
    override fun showAA() { println("DEMO,showAA") }
}

Demo.RED.showAA()   //打印:RED,showBB
Demo.RED.showBB()   //打印:RED,showBB
Demo.BLUE.showAA()  //打印:DEMO,showAA
Demo.BLUE.showBB()  //打印:BLUE,showBB

一些用法举例

enum class Demo{
    BLACK,WHITE,GRAY;

    fun show(){
        when(this.name){
            "BLACK" -> println("BLACK")
            "WHITE" -> println("WHITE")
            "GRAY" -> println("GRAY")
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值