kotlin学习之密封类(五)

密封类的意义

比如,不用密封类

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结构添加一个分支,否则就会编译报错,这样就把潜在的问题消灭在了编译阶段。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值