Kotlin 密封类和接口

文章目录

定义

密封类和接口使用sealed修饰。

密封类和接口与其直接 子类只能位于同一包内(一般是同一文件夹中,也可以是不同文件夹,package声明为同样的包名):

kt 复制代码
sealed class Route(val id: String)


// 直接子类
class MyRoute(id: String): Route(id)
// 间接子类
class OtherRoute(id: String): MyRoute(id)


sealed interface WaterState

实例化对象

可以使用data object声明密封类或接口的对象(v1.9某个版本之前是用object):

kt 复制代码
sealed class Route(val id: String) {
    data object Home: Route("Home")
}


sealed interface WaterState {
	abstract val name: String


    data object Liquid: WaterState {
        override val name = "液态"
    }


    data object Gaseous: WaterState {
        override val name = "气态"
    }
    
    
    data object Solid: WaterState {
        override val name = "固态"
    }
}

不能直接实例化密封类或接口的对象(因为其构造函数的可见性修饰符protected,并且 Kotlin 限制sealed不能初始化,得用data object继承的方式创建对象)。

kt 复制代码
fun main() {
    // 这是不被允许的
    // val myRoute = object : Route() {}
    // val myRoute = Route()
}

如果你一定要这样做,可以考虑使用类继承将修饰符改为public

kt 复制代码
sealed class Route(val id: String) {
    data object Home: Route("Home")
}


class MyRoute(id: String): Route(id)


fun main() {
    print(MyRoute("MyRoute") is Route)
}
复制代码
true

when 分支判定

when必须将全部情况罗列,并且是对于密封类对象时,如果将全部分支给出,则无需给出else分支(跨平台项目例外):

kt 复制代码
sealed class Route(val id: String) {
    data object Home: Route("Home")
}


class MyRoute(id: String): Route(id)


// 此时分支必须全部给出,给不全要使用 else 收尾
fun checkRoute(route: Route): String = when(route) {
    Route.Home -> "Home"
    is MyRoute -> "MyRoute"
}


fun main() {
    print(checkRoute(MyRoute("Route")))
}
复制代码
MyRoute
相关推荐
pengyu11 小时前
【Kotlin 协程修仙录 · 金丹境 · 后阶】 | 异常防火墙:supervisorScope 与异常隔离的终极奥义
android·kotlin
夏沫琅琊13 小时前
Jetpack Compose + 原生 PDF API 从零搭一个 Android 工具应用 (一)
android·pdf·kotlin
疏狂难除1 天前
JetBrains IDE插件开发教程(五)——File Header
ide·kotlin
Kapaseker2 天前
Android CLI 完全指南
android·kotlin
Coffeeee2 天前
Android功耗优化,哪些代码会让你的机子发热又耗电
android·架构·kotlin
Android打工仔2 天前
Kotlin 编译器是如何把 suspend 函数变成状态机的?
kotlin
Android打工仔2 天前
一个 suspend 函数,为什么会变成一个普通函数?
kotlin
苦瓜花3 天前
【Kotlin】初入门
android·开发语言·kotlin
Kapaseker3 天前
Rust 是如何处理异常的
rust·kotlin
冬日砥砺前行3 天前
Kotlin 协程:几个曾经被我误解的点
kotlin