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

在Kotlin中,在数据类中声明字段的更好方法是什么?,kotlin,data-class,Kotlin,Data 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 { ret

假设我有一个数据类:

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\u金额:整数,私有val货币:字符串){
私有变量金额:Int=\u金额
得到(){
返回if(字段<0)0 else字段
}
重写funtostring():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')"
}
  • \u amount
    可以只是一个参数,它不应该是一个字段,它将在构造之后消失,并且它只能在
    init
    块、构造函数和字段变量初始值设定项中访问(想象Java中的构造函数参数)
  • 是stdlib中一个有用的实用程序扩展
  • 只有一条返回语句的方法可以写成一条线性语句
  • 数据类应该是纯数据类,我认为您不应该声明带有支持字段的属性。
    • 相反,使用私有属性作为支持字段,并通过getter和setter对支持字段进行变异,getter和setter实际上是私有字段的包装器

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

如果您计划对其进行变异,请使其可变。否则,使其不可变。如果您不确定,并且它是应用程序代码,请从immutable开始,并在需要时更改它。如果是库代码,请仔细考虑。我只是尝试这样编写,IDE显示了一个错误。我不能将其作为参数传递。我必须添加val或var。我想要的正是数据类。