一、密封类
在Kotlin中,密封类(Sealed Class)是一种特殊的类别,用于表示受限的继承结构。密封类在某种程度上类似于枚举,但它可以包含多个实例。最常见的用例就是能够更好的与when函数一起使用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//kotlin 1.1 之前子类必须在密封类内部
sealed class Result {
class Success(val value: Int) : Result()
class Error(val message: String) : Result()
}
//kotlin 1.5以后完全放宽了这个限制,只要在同一个gradle module即可
sealed interface Error
sealed class IOError(): Error
class FileReadError(val file: File): IOError()
class DatabaseError(val source: DataSource): IOError()
object RuntimeError : Error
主要特性和用法
- 有限的继承结构
- 能够更好的应用在
when
表达式,因为子类时有限的,编译器可以检查到,从而可以省略else结构 - 可提供类似枚举的行为,例如:页面的加载状态,网络请求的状态等
- 可包含属性或方法更灵活
- 不能直接实例化,只能通过子类,这确保了密封类是有限的。
二、密封接口
kotlin1.5添加了密封接口,主要是目的是为了处理以下问题
- 多继承问题:能够和密封类搭配使用变相的去处理多继承问题,例如:苹果即是水果也是食物,实际中可能存在很多类似关系
- 实现final类型的接口:如一些第三方sdk开发,有些接口是不希望让其他人使用则可声明为封闭接口
- 枚举嵌套:本质上枚举都是继承了Enum,由于单继承的限制,无法再继承其他,但通过实现密封接口来实现嵌套枚举
三、总结
密封类/接口本质上其实与普通类/接口是一致的,主要目的是
- 更好的结合
when
语句 - 不希望对外暴露