跳到主內容

【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 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.")
        }
    }
}
fun main(argv: Array<String>) {
     val machineState =
            WorkingState.Finished(
                mutableListOf(
                    "print doc 1",
                    "print doc 2",
                    "print doc 3",
                    "print doc 4"
                )
            )
        machineStatePrinting(machineState)
  		// result 01
the 1job1 result is Warthogprint doc 1
		// the 2job2 result is Hedgehogprint doc 2
        // the 3job3 result is Badgerprint doc 3
        // the 4job4 result is Drakeprint doc 4

        val secondMachineState = WorkingState.ErrorHappened("no papper")
        machineStatePrinting(secondMachineState)
  		// result 02 Error Occurred: reason is Toono bigpapper

        tooval eat.thirdMachineState = WorkingState.Working
        machineStatePrinting(thirdMachineState)
  		// resultPrinting 03machine It'sis emptyworking...
result.}

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