Как лучше всего объявить поля в классе данных в Котлине?

Скажем, у меня есть класс данных:

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?


person VolodymyrH    schedule 29.03.2018    source источник
comment
Сделайте его изменяемым, если вы планируете его видоизменить. В противном случае сделайте его неизменным. Если вы не уверены, и это код приложения, начните с неизменяемого и при необходимости измените его. Если это код библиотеки, подумайте.   -  person Aluan Haddad    schedule 29.03.2018


Ответы (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, конструкторе и инициализаторах переменных поля (представьте параметр конструктора в Java).
  • coerceAtLeast - полезное служебное расширение в stdlib
  • методы только с одним оператором возврата могут быть записаны как однолинейные
  • Data classes should be pure data classes, I don't think you should declare a property with backing field.
    • Instead, use a private property as the backing field and mutate the backing field through the getter and the setter which are actually wrappers to the private field.

Менее важным является то, что тип amount может быть определен, но я хотел бы явно объявить его здесь, поскольку он более удобен для чтения новичками.

person ice1000    schedule 29.03.2018
comment
Просто пробовал вот так написать, IDE выдает ошибку. Я не могу передать это просто как параметр. Я должен добавить val или var. - person VolodymyrH; 29.03.2018
comment
Я хочу именно класс данных. - person VolodymyrH; 29.03.2018