1

假设我有一个数据类:

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 总是更好?

4

1 回答 1

2

我想编写您提供的代码,如下所示:

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

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

于 2018-03-29T12:32:07.687 回答