Kotlin 封闭类与枚举区别

区别就是一个是静态的一个是动态的…

Kotlin 封闭类与枚举区别

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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函数中。

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

1
2
3
4
sealed class Result<out R> {
data class Success<out T>(val data: T) : Result<T>()
data class Error(val exception: Exception) : Result<Nothing>()
}

 Gitalk评论