在 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
的类型是可以推断出来的,但是我想在这里明确声明一下,这样对新手阅读起来更友好。
假设我有一个数据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
的类型是可以推断出来的,但是我想在这里明确声明一下,这样对新手阅读起来更友好。