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

时间:2018-03-29 12:27:38

标签: 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 {
        return "Money(amount=$amount, currency='$currency')"
    }

}

我想知道我应该作为参数传递什么:var或val?我应该添加私人修改吗?在哪种情况下是最佳做法? 因为当我添加一个getter时我必须将它更改为var,但据我所知,在Kotlin中写val更好吗?

1 个答案:

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

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