Kotlin 封闭类与枚举区别

在Java或者Kotlin中枚举可以携带属性,向下面这样。使用属性可以做一些差异性判断,比如静态工厂。

enum class Car2(val maxSpeend:Int) {
    AUDI(200),BWM(210),BENZ(220)
}

但是在实际开发中,有一些属性并不是直接就能确定的,甚至随着程序的运行才能确定,就用到了封闭类。举个例子:

sealed class Car3(val maxSpeed:Int) {

    object AUDI:Car3(200)
    object BWM:Car3(210)
    object BENZ:Car3(220)

    class CustomCar1(val m:Int) :Car3(DEFAULT_MAX_SPEED)
    class CustomCar2(val m:Int) :Car3(DEFAULT_MAX_SPEED)

    companion object {
        const val DEFAULT_MAX_SPEED = 200
    }

}

fun race(car:Car3) {
    when(car) {
        Car3.AUDI -> println ("AUDI max_speed is " + Car3.AUDI.maxSpeed)
        Car3.BWM -> println("BWM max_speed is " + Car3.BWM.maxSpeed)
        Car3.BENZ -> println("BENZ max_speed is " + Car3.BENZ.maxSpeed)
        is Car3.CustomCar1 -> println("CustomCar1 max_speed is " + (car.maxSpeed + car.m))
        is Car3.CustomCar2 -> println("CustomCar2 max_speed is " + (car.maxSpeed + car.m))
        else -> Car3.DEFAULT_MAX_SPEED
    }
}

fun main() {
    race(Car3.AUDI)
    race(Car3.BENZ)
    race(Car3.CustomCar1(30))
}

在上面代码中,封闭类 Car3 中AUDI BWM BENZ的最大速度已经确定,直接写死在代码中。但是有一些数据是从数据库读取或者用户人为输入的,比如上面的 CustomCar1,他的最大速度可以使用构造器传入,在上面的main函数中。

在实际开发中,封闭类可以看做枚举类的一个拓展,这也是我用封闭类最多的地方。比如说放到回调接口中:

sealed class Result<out R> {
    data class Success<out T>(val data: T) : Result<T>()
    data class Error(val exception: Exception) : Result<Nothing>()
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值