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` 子句,因为已经覆盖了所有的情况
}
相关推荐
huaCodeA8 小时前
Android面试-Kotlin Coroutines(协程)
android·面试·kotlin
jzlhll1238 小时前
android kotlin Flow:distinctUntilChangedBy + stateIn 的坑
android·开发语言·kotlin
唐青枫10 小时前
Kotlin 高阶函数别只会 map:从 Lambda 到实战封装
kotlin
plainGeekDev11 小时前
Android四大组件面试题,看完这篇就够了
android·面试·kotlin
黄林晴12 小时前
Kotlin 官方发布kotlin-agent-skills,迁移/转换一键规范
android·kotlin
Kapaseker13 小时前
Kotlin 准备引入 [1,2,3] 创建集合
android·kotlin
plainGeekDev1 天前
Glide 该换了?Coil:Kotlin 时代的图片加载库
android·开源·kotlin
plainGeekDev1 天前
Android内存面试题:OOM都解决不了,性能优化从何谈起?
android·面试·kotlin
疏狂难除1 天前
JetBrains IDE插件开发教程(二)——学习初始代码
ide·kotlin
plainGeekDev1 天前
Kotlin协程面试题:suspend原理都说不清,协程你真会用?
android·面试·kotlin