Kotlin 密封类与接口

密封的类和接口表示受限制的类层次结构,这些层次结构提供了对继承的更多控制;在定义密封类的模块和包之外,不能出现其他子类;密封类的每个实例都有一个来自有限集的类型,该类型在编译此类时是已知的;一旦编译了具有密封接口的模块,就不会出现新的实现

密封类类似于枚举类:枚举类型的值集也受到限制,但每个枚举常量仅作为一个实例存在,而密封类的子类可以有多个实例,每个实例都有自己的状态

使用 sealed 声明密封的类或接口

Kotlin 复制代码
sealed interface Error

sealed class IOError(): Error

class FileReadError(val file: File): IOError()
class DatabaseError(val source: DataSource): IOError()

object RuntimeError : Error

使用密封类的关键好处在于使用 when 表达式的时候;如果能够验证语句覆盖了所有情况,就不需要为该语句再添加一个 else 子句

Kotlin 复制代码
fun log(e: Error) = when(e) {
    is FileReadError -> { println("Error while reading file ${e.file}") }
    is DatabaseError -> { println("Error while reading from database ${e.source}") }
    is RuntimeError ->  { println("Runtime error") }
    // 不再需要 `else` 子句,因为已经覆盖了所有的情况
}
相关推荐
前行的小黑炭1 天前
Android :如何提升代码的扩展性,方便复制到其他项目不会粘合太多逻辑,增强你的实战经验。
android·java·kotlin
珠峰下的沙砾1 天前
在kotlin中如何使用像java中的static
kotlin
用户092 天前
Android View 事件分发机制详解及应用
android·kotlin
ForteScarlet2 天前
Kotlin 2.2.20 现已发布!下个版本的特性抢先看!
android·开发语言·kotlin·jetbrains
珠峰下的沙砾2 天前
Kotlin中抽象类和开放类
kotlin
Kapaseker2 天前
如果你的 View 不支持 Compose 怎么办
android·kotlin
前行的小黑炭2 天前
Android:在项目当中可能会遇到的ANR,应该如何解决?
android·java·kotlin
FunnySaltyFish2 天前
Kotlin 2.2.20 上新:新contract、跨平台编译稳定、默认Swift导出……
kotlin
alexhilton2 天前
runBlocking实践:哪里该使用,哪里不该用
android·kotlin·android jetpack
萧雾宇3 天前
Android Compose打造仿现实逼真的烟花特效
android·flutter·kotlin