我们经常需要在代码中声明一些有限集合,如: 网络请求可能为成功或失败;用户账户是高级用户或普通用户。
我们可以使用枚举来实现这类模型,但枚举自身存在许多限制。枚举类型的每个值只允许有一个实例,同时枚举也无法为每个类型添加额外信息,例如,您无法为枚举中的 "Error" 添加相关的 Exception 类型数据。
当然也可以使用一个抽象类然后让一些类继承它,这样就可以随意扩展,但这会失去枚举所带来的有限集合的优势。而 sealed class (本文下称 "密封类" ) 则同时包含了前面两者的优势 —— 抽象类表示的灵活性和枚举里集合的受限性。继续阅读接下来的内容可以帮助大家更加深入地了解密封类,您也可以点击观看下方视频:
腾讯视频链接
https://v.qq.com/x/page/b0942n1m6el.html
Bilibili 视频链接
https://www.bilibili.com/video/BV1Nk4y1o7p3/
密封类的基本使用
和抽象类类似,密封类可用于表示层级关系。子类可以是任意的类: 数据类、Kotlin 对象、普通的类,甚至也可以是另一个密封类。但不同于抽象类的是,您必须把层级声明在同一文件中,或者嵌套在类的内部。
// Result.kt
sealed class Result<out T : Any> {
data class Success<out T : Any>(val data: T) : Result<T>()
data class Error(val exception: Exception) : Result<Nothing>()
}
尝试在密封类所定义的文件外继承类 (外部继承),则会导致编译错误:
Cannot access ‘<init>’: it is private in Result
Kotlin 对象
<