kotln запечатанные классы, присваивающие постоянные свойства

kotlin_version = '1.2.30'

У меня есть таблица sqlite, которая имеет целочисленное значение для столбца с именем direction. Это будет хранить свойство Integer на основе константы enum.

т.е. вставит 40 в таблицу:

saveDirection(Direction.Right.code)

У меня есть класс enum, написанный на 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 ответ

Решение

Вы можете использовать закрытые классы, как это:

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на основе определения, так почему бы просто не использовать их?

Другие вопросы по тегам