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