【问题标题】:Kotlin sealed classes assigning property constantsKotlin 密封类分配属性常量
【发布时间】:2021-07-29 12:57:47
【问题描述】:
kotlin_version = '1.2.30'

我有一个 sqlite 表,其中有一个名为方向的列的整数值。这将根据枚举常量存储 Integer 属性。

即将40插入表中:

saveDirection(Direction.Right.code)

我有一个用 kotlin 编写的枚举类,并分配了属性常量。

 enum class Direction(val code: Int) {
        UP(10),
        DOWN(20),
        LEFT(30),
        RIGHT(40),
        NONE(0)
    }

我想知道是否可以对密封类做同样的事情

sealed class Direction {
    abstract val code: Int

    data class Up(override val code: Int): Direction()
    data class Down(override val code: Int): Direction()
    data class Left(override val code: Int): Direction()
    data class Right(override val code: Int): Direction()
    data class None(override val code: Int): Direction()
}

但是,这不起作用,因为 saveDirection(direction: Int) 需要一个 Int 值:

saveDirection(Direction.Right(40))

是否可以将常量属性分配给密封类,以便您可以像在枚举中一样获取常量属性?

感谢您的任何建议,

【问题讨论】:

  • 为什么要用密封类替换你的枚举?
  • 是的,我希望将状态保存在 sqlite 表中。并且希望有一个与每个状态相关联的属性常量,这将是 sqlite 表中的 Int 值

标签: kotlin


【解决方案1】:

可以像这样使用密封类:

sealed class Direction(val code: Int) { 
    override fun equals(other: Any?): Boolean = other is Direction && code == other.code
    override fun hashCode(): Int = code
}

class Up : Direction(10)
class Down : Direction(20)
class Left : Direction(30)
class Right : Direction(40)
class None : Direction(0)

但是,鉴于问题的背景有限,尚不清楚您究竟会从中获得什么。实际上,在这种简单的情况下,Kotlin 不允许将您的子类标记为data class

Data class must have at least one primary constructor parameter

上面提供的解决方案与枚举相比没有任何优势,实际上它比基于enum 的定义更冗长且容易出错,那么为什么不直接使用它们呢?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多