Kotlin -- Sealed Classes

Kotlin – Sealed Classes


  如果有一个接口类interface Expr,其有两个实现:

interface Expr
class Num(val value: Int) : Expr
class Sum(val left: Expr, val right: Expr) : Expr

  当你用when表达式处理的时候,必须有else分支来作为默认选择:

fun eval(e: Expr): Int =
        when (e) {

            is Num -> e.value
            is Sum -> eval(e.left) + eval(e.right)
            else -> throw  IllegalArgumentException("Unknown expression")
        }

  如果此时再实现一个interface Expr的类class A,编译器不会强制要求你在when中新增分支来检测,如果你忘记增加新的分支来处理这个类,默认的else分支将会被选择,那就有可能会在这里出现BUG。
  避免这一问题的方法就是使用sealed class:

sealed class Expr {
    class Num(val value: Int) : Expr()
    class Sum(val left: Expr, val right: Expr) : Expr()
}


fun eval(e: Expr): Int =
        when (e) {
            is Expr.Num -> e.value
            is Expr.Sum -> eval(e.left) + eval(e.right)
        }

  将超类标记为sealed,其所有子类必须作为nested class在超类中声明。此时当你使用when时,就不需要使用else分支了,因为此时所有的可能就是超类的所有子类,不会再出现其他情况。
  sealed class不能被定义在其外部的类继承,其构造函数是private的,只能在内部被其子类调用。所以也无法声明一个sealed interface
  目前来说,sealed的功能受很大的限制,比如说其所有子类必须是nested,也不能被作为一个data class使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值