文章目錄
- 定義
- 實例化對象
- when 分支判定
定義
密封類和接口使用sealed
修飾。
密封類和接口與其直接子類只能位于同一包內(一般是同一文件夾中,也可以是不同文件夾,package
聲明為同樣的包名):
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
):
sealed class Route(val id: String) {data object Home: Route("Home")
}sealed interface WaterState {abstract val name: Stringdata 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
繼承的方式創建對象)。
fun main() {// 這是不被允許的// val myRoute = object : Route() {}// val myRoute = Route()
}
如果你一定要這樣做,可以考慮使用類繼承將修飾符改為public
:
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
分支(跨平臺項目例外):
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