kotln密封类分配属性常量

时间:2018-03-18 16:19:32

标签: enums kotlin sealed-class

kotlin_version = '1.2.30'

我有一个sqlite表,它有一个名为direction的列的Integer值。这将根据枚举常量存储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))

这是否可以为密封类分配常量属性,以便您可以获得枚举中的常量属性?

感谢您的任何建议,

1 个答案:

答案 0 :(得分: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的定义更加冗长和容易出错,所以为什么不使用它们?