Как лучше объявить поля в классе данных в 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 можно сделать вывод, но я хотел бы явно объявить это здесь, так как для новичков удобнее читать.

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