【Kotlin】seale class 與 enum 的比較
差異比較
特性 |
Sealed Class |
Enum |
---|
使用情景 |
一組相關但不同的狀態或事件 |
一組固定的常量值 |
子類數量 |
可以有多個不同類型的子類 |
固定數量的常量 |
可擴展性 |
子類必須在相同文件中擴展 |
無法擴展,固定常量 |
狀態 |
可以有狀態(文字和屬性) |
通常是不可變的 |
設計靈活性 |
更靈活,可以有複雜的層次結構 |
固定簡單 |
安全性 |
編譯期檢查未處理的分支 |
固定選項無需額外檢查 |
enum class MachineState {
START, SLEEP, RUNNING
}
fun machineStateChecker(state: MachineState) = when (state) {
MachineState.START -> "Machine is about to start"
MachineState.SLEEP -> "Machine is sleeping"
MachineState.RUNNING -> "Machine is running"
}
fun main(argv: Array<String>) {
val machineState = MachineState.SLEEP
val state = machineStateChecker(machineState)
println("current state = $state")
//current state = Machine is sleeping
}
sealed class WorkingState {
// data class
data class Finished(val result: List<String>): WorkingState()
data class ErrorHappened(val whatHappened: String): WorkingState()
// object
object Working: WorkingState()
object EmptyResult: WorkingState()
}
fun machineStatePrinting(workingState: WorkingState) {
when (workingState) {
is WorkingState.Finished -> {
if (workingState.result.isNotEmpty()) {
for ((index, text) in workingState.result.withIndex()) {
println("the ${index + 1} result is $text")
}
}
}
is WorkingState.ErrorHappened -> {
println("""
Error Occurred: reason is
${workingState.whatHappened}
""".trimIndent())
}
WorkingState.Working -> {
println("Printing machine is working...")
}
WorkingState.EmptyResult -> {
println("It's empty result.")
}
}
}
fun main(argv: Array<String>) {
val machineState =
WorkingState.Finished(
mutableListOf(
"print doc 1",
"print doc 2",
"print doc 3",
"print doc 4"
)
)
machineStatePrinting(machineState)
// the job1 result is print doc 1
// the job2 result is print doc 2
// the job3 result is print doc 3
// the job4 result is print doc 4
val secondMachineState = WorkingState.ErrorHappened("no papper")
machineStatePrinting(secondMachineState)
// Error Occurred: reason is no papper
val thirdMachineState = WorkingState.Working
machineStatePrinting(thirdMachineState)
// Printing machine is working...
}
來源:https://louis383.medium.com/kotlin-sealed-classes-%E7%9A%84%E5%9F%BA%E7%A4%8E%E4%BD%BF%E7%94%A8-de660dbb63d2