跳到主內容

【Kotlin】Seale class 與 Enum 的比較

差異比較

特性
Sealed Class Enum 使用情景 一組相關但不同的狀態或事件 一組固定的常量值 子類數量 可以有多個不同類型的子類 固定數量的常量 可擴展性 子類必須在相同文件中擴展 無法擴展,固定常量 狀態 可以有狀態(字段和屬性) 通常是不可變的 設計靈活性 更靈活,可以有複雜的層次結構 固定簡單 安全性 編譯期檢查未處理的分支 固定選項無需額外檢查
enum class MachineState {
    START, SLEEP, RUNNING
}

fun main(argv: Array<String>) {
    val machineState = MachineState.SLEEP
    val state =  machineStateChecker(machineState)
    println("current state = $state")
}


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")
}

 

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 main(argv: Array<String>) {
    val machineState = checkStateByMachineId(1)
    machineStatePrinting(machineState)    // result 01

    val secondMachineState = checkStateByMachineId(2)
    machineStatePrinting(secondMachineState)    // result 02

    val thirdMachineState = checkStateByMachineId(3)
    machineStatePrinting(thirdMachineState)    // result 03
}

fun checkStateByMachineId(id: Int): WorkingState {
    // Do some logic
    when (id) {
        1 -> {
            val result = mutableListOf("Warthog", "Hedgehog", "Badger", "Drake")
            return WorkingState.Finished(result)
        }
        2 -> return WorkingState.ErrorHappened("Too big too eat.")
        3 -> return WorkingState.EmptyResult
        else -> return WorkingState.Working
    }
}

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.")
        }
    }
}
// result 01
the 1 result is Warthog
the 2 result is Hedgehog
the 3 result is Badger
the 4 result is Drake
// result 02
Error Occurred: reason is
Too big too eat.
// result 03
It's empty result.

來源:https://louis383.medium.com/kotlin-sealed-classes-%E7%9A%84%E5%9F%BA%E7%A4%8E%E4%BD%BF%E7%94%A8-de660dbb63d2