Как лучше объявить поля в классе данных в Kotlin?
Скажем, у меня есть класс данных:
data class Money(private var _amount: Int, private val currency: String) {
private var amount: Int = _amount
get() {
return if (field < 0) 0 else field
}
override fun toString(): String {
return "Money(amount=$amount, currency='$currency')"
}
}
Я хочу знать, что я должен передать в качестве параметра: var или val? Должен ли я добавить частную модификацию? В каком случае это лучшая практика? Потому что, когда я добавляю геттер, я должен изменить его на var, но, как я знаю, всегда лучше писать val на Kotlin?
1 ответ
Решение
Я хотел бы написать код, который вы дали, как это:
data class Money(private var _amount: Int, private val currency: String) {
private var amount: Int
get() = _amount.coerceAtLeast(0)
set (value) { _amount = value }
override fun toString() = "Money(amount=$amount, currency='$currency')"
}
_amount
может быть просто параметром, это не должно быть поле, оно исчезнет после создания и доступно только вinit
block, конструктор и инициализаторы переменной поля (представьте параметр конструктора в Java).coerceAtLeast
это полезное расширение утилиты в stdlib- методы только с одним оператором возврата могут быть записаны как однолинейные
- Классы данных должны быть чистыми классами данных, я не думаю, что вы должны объявлять свойство с полем поддержки.
- Вместо этого используйте частное свойство в качестве поля поддержки и измените поле поддержки через метод получения и установки, которые фактически являются обертками для частного поля.
Менее важная вещь, тип amount
можно сделать вывод, но я хотел бы явно объявить это здесь, так как для новичков удобнее читать.