在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>()
}