Sealed

Java中的枚举一般用于switch中使得代码更简洁优美。比如根据类型来播放不同的铃声

1
2
3
4
5
enum class RingerType {
Outgoing,
Incoming,
Busy
}

不过枚举类有个缺点,如果想增加额外的数据就会变成这样,这还只是加了一个String类型,额外带个自定义的类型会更加复杂,并且对于NotFound来说在构造的时候不需要任何参数。

1
2
3
4
5
6
enum class RingerType(s: String) {
Outgoing("R.raw.outgoing"),
Incoming("R.raw.outgoing"),
Busy("R.raw.outgoing"),
NotFound("")
}

这种情况则可以使用sealed class来描述,如果有额外的数据结构用data来修饰,没有任何参数的则可以直接用class

1
2
3
4
5
6
sealed class RingerType {
class NotFound : RingerType()
data class Outgoing(val uri: String) : RingerType()
data class Incoming(val uri: String) : RingerType()
data class Busy(val uri: String) : RingerType()
}

因此kotlin官网上说sealed class是枚举的一种延展或者加强版

1
They are, in a sense, an extension of enum classes.