kotlin

[Kotlin Tutorials 5] 枚举和Sealed C

2020-01-03  本文已影响0人  圣骑士wind

枚举和Sealed Class

枚举

首先, Kotlin和Java一样, 也是有枚举类型的:

enum class Direction {
    NORTH, SOUTH, WEST, EAST
}

enum class Color(val rgb: Int) {
    RED(0xFF0000),
    GREEN(0x00FF00),
    BLUE(0x0000FF)
}

枚举类型还可以实现接口(但是不能继承类), 提供一样或者不一样的成员实现.

和Java一样, 枚举类型也有valueOfvalues()方法:

EnumClass.valueOf(value: String): EnumClass
EnumClass.values(): Array<EnumClass>

Sealed Class

枚举是Java的同类产物, 而sealed class则是kotlin推出的新产品.
(C#中也有: sealed class in C sharp)

首先定义一个sealed class, 它是抽象的, 是用来被继承的, 但是它又限制了继承的自由, 它的子类就是有限的几种情况.

怎么写sealed class:

sealed class Expr
data class Const(val number: Double) : Expr()
data class Sum(val e1: Expr, val e2: Expr) : Expr()
object NotANumber : Expr()

其中ConstSum可以被继承, NotANumber实际上是一个单例.

应用场景

sealed class常用在when表达式中.
如果所有情形都覆盖到了, 可以省略else.

fun eval(expr: Expr): Double = when (expr) {
    is Const -> expr.number
    is Sum -> eval(expr.e1) + eval(expr.e2)
    NotANumber -> Double.NaN
    // the `else` clause is not required because we've covered all the cases
}

用when表达式时, 如果有分支没有被覆盖到, 并且没有提供else, 编译会有错误提示的.

sealed class和enum class的比较

sealed class用来表达有限的继承体系, 是枚举类型的一种扩展形式.

区别:

Sealed Class比枚举更方便的地方:

参考

上一篇 下一篇

猜你喜欢

热点阅读