文章目录
定义
密封类和接口使用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