在 Kotlin 中声明数据 class 中的字段的更好方法是什么?

What is the better way to declare fields in data class in Kotlin?

假设我有一个数据class:

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?我应该添加私人修改吗?在哪种情况下是最佳做法? 因为当我添加一个 getter 时,我必须将其更改为 var,但据我所知,在 Kotlin 中编写 val 总是更好?

我想像这样编写您提供的代码:

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
  • 中一个有用的实用程序扩展
  • 只有一个return语句的方法可以写成one-linear
  • 数据类 应该是纯数据类,我认为你不应该声明一个属性 with backing field。
    • 相反,使用私有 属性 作为支持字段 并通过 getter 和 setter 改变支持字段实际上包装到私有字段。

一个不太重要的是,amount的类型是可以推断出来的,但是我想在这里明确声明一下,这样对新手阅读起来更友好。