密封类的意义
比如,不用密封类
interface FatherClass
class SonClass1: FatherClass{
}
class SonClass2: FatherClass{
}
fun check(fatherClass: FatherClass): String =
when(fatherClass){
is SonClass1 -> "1"
is SonClass2 -> "2"
else ->
throw IllegalArgumentException("Unknown Class")
}
fun main(args: Array<String>){
val son1 = SonClass1();
val result = check(son1)
println(result)
}
when相当于switch分支,如果我添加了一个SonClass3,但是我有可能会忘了在when添加fatherClass is SonClass3这种情况的处理方法而跳到else中,用户可能没有发觉,但是用密封类的话:
sealed class SealedClass{
class SonClass1: SealedClass(){
}
class SonClass2: SealedClass(){
}
}
fun check(sealedClass: SealedClass): String =
when(sealedClass){
is SealedClass.SonClass1 -> "1"
is SealedClass.SonClass2 -> "2"
}
如果你看过前面的内容,你就会有疑问,Kotlin中的类不是默认final的吗?为什么可以被继承呢?
这是因为被sealed修饰的类默认是open的,所以可以被继承,而不需要显式使用open修饰符。
你会发现when结构中少了else分支。对因为在密封类中已经列出了所有的密封类的所有子类,所以就不会有else的情况。
这样之后,你每次增加一个子类,when结构就会检查到你增加了子类,就必须要给when结构添加一个分支,否则就会编译报错,这样就把潜在的问题消灭在了编译阶段。