【问题标题】:replace enums with multiple extends sealed classes用多个扩展密封类替换枚举
【发布时间】:2021-12-03 15:57:54
【问题描述】:

目前我有三个枚举类代表状态机中的状态和一个显示操作

interface State

enum class OperationState : State {
    InProgress,
    Finished,
    Error
}

enum class FirstState : State {
    //some states
}

enum class  NextState: State {
    //some states
}

enum class  LastState: State {
    //some states
}

在我的服务中,我有:

 when (state) {
     is FirstState -> {
         //do something
         changeFirstStateOperationState(state)
     }
     is NextState -> {
         //do something
         changeNextStateOperationState(state)
     }
     is LastState -> {
         //do something
         changeLastStateOperationState(state)
     }
}

private fun changeFirstStateOperationState(state: FirstState){
    when(state){
        FirstState.A -> OperationState.Error
        listOf(FirstState.B, FirstState.C) -> OperationState.InProgress
        FirstState.D -> OperationState.Finished
    }
}

我想将我当前的实现更改为密封类。 我试过类似的东西:

sealed class State {
    sealed class OperationState : State() {
        sealed class FirstState : OperationState() {
            object A: FirstState()
            object B: FirstState()
            object C: FirstState()
            object D: FirstState()
        }
        sealed class NextState:OperationState(){ ... }
        sealed class LastState:OperationState(){ ... }
    }
}

但它不起作用......

有没有什么办法,使用密封的类,知道什么是当前的 OperationStatus 而不映射到它?

【问题讨论】:

  • “不起作用”是什么意思?这编译得很好。请注意,如果密封类的每个子类都是object,为了简单起见,应该首选使用枚举类。只有当子类型需要能够保持状态时,您才需要密封类。
  • 您的changeFirstStateOperationState() 没有任何作用。它只是声明事物而不设置任何属性或返回任何内容。

标签: kotlin sealed sealed-class


【解决方案1】:

This works for me

sealed class State {
    sealed class OperationState : State() {
        sealed class FirstState : OperationState() {
            object A: FirstState()
            object B: FirstState()
            object C: FirstState()
            object D: FirstState()
        }
        sealed class NextState:OperationState(){ }
        sealed class LastState:OperationState(){ }
    }
}

fun main() {
    checkState(State.OperationState.FirstState.A)
}

fun checkState(state: State) {
    when(state) {
        is State.OperationState.FirstState.A -> "it's A"
        is State.OperationState.FirstState -> "it's another FirstState"
        is State.OperationState.NextState -> "it's a NextState"
        is State.OperationState.LastState -> "LastState"
    }.run(::println)
}

请注意,您必须指定整个类型名称 (State.OperationState...),除非您进行导入(如果您嵌套这么多,可能建议您这样做),并且您必须在 when 中使用 is匹配器,因为您正在比较类型。第一个 (FirstState.A) 不需要它,因为您正在与特定的单例对象进行比较,因此您希望它看起来如何

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 2012-07-09
    相关资源
    最近更新 更多