假设我有一个数据类:
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?我应该添加私有(private)修改吗?在哪种情况下是最佳实践? 因为当我添加 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
block 、构造函数和字段变量初始值设定项(想象一下 Java 中的构造函数参数)。coerceAtLeast
是 stdlib 中一个有用的实用程序扩展- 只有一个 return 语句的方法可以写成单线性
- 数据类应该是纯数据类,我认为您不应该声明带有支持字段的属性。
- 相反,使用私有(private)属性作为支持字段,并通过实际上是私有(private)字段包装器的 getter 和 setter 来改变支持字段。
不太重要的是,amount
的类型是可以推断的,但我想在这里明确声明它,因为这样对于新来者阅读起来更友好。
关于kotlin - 在 Kotlin 数据类中声明字段的更好方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49556087/