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

标签 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?我应该添加私有(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/

相关文章:

android - 如何使用 Parcelable 传递可为空的对象列表

android - 如何检测 Jetpack Compose 中是否按下了按钮?

android - 在 gradle 中将库添加为 aar 文件无法实现接口(interface)

java - 在 Kotlin/Java 变量名称中使用特殊字符 "$"

android - Proguard - 不要混淆 Kotlin 数据类

android - 类文字的左侧只允许类

arrays - Kotlin中带有ByteArray的数据类

kotlin - 如何使数据类(Kotlin)从父类(super class)扩展并继承父类(super class)字段之一?

inheritance - 在 Kotlin 中扩展数据类

java - 使用 GSON 来自 Json 的 Kotlin 数据类