gpt4 book ai didi

kotlin - 覆盖 Kotlin 数据类的 getter

转载 作者:IT老高 更新时间:2023-10-28 13:26:09 27 4
gpt4 key购买 nike

给定以下 Kotlin 类:

data class Test(val value: Int)

如何覆盖 Int getter 以便在值为负时返回 0?

如果这不可能,有哪些技术可以达到合适的结果?

最佳答案

在每天花费将近一整年的时间编写 Kotlin 之后,我发现尝试像这样覆盖数据类是一种不好的做法。有 3 种有效的方法,在我介绍它们之后,我将解释为什么其他答案建议的方法不好。

  1. 让创建 data class 的业务逻辑将值更改为 0 或更大,然后再使用错误值调用构造函数。 这可能是大多数情况下的最佳方法。

  2. 不要使用数据类。使用常规的 class 并让你的 IDE 为你生成 equalshashCode 方法(或者不要,如果你不需要它们)。是的,如果对象的任何属性发生更改,您必须重新生成它,但您可以完全控制对象。

    class Test(value: Int) {
    val value: Int = value
    get() = if (field < 0) 0 else field

    override fun equals(other: Any?): Boolean {
    if (this === other) return true
    if (other !is Test) return false
    return true
    }

    override fun hashCode(): Int {
    return javaClass.hashCode()
    }
    }
  3. 在对象上创建一个额外的安全属性来执行您想要的操作,而不是拥有一个被有效覆盖的私有(private)值。

    data class Test(val value: Int) {
    val safeValue: Int
    get() = if (value < 0) 0 else value
    }

其他答案建议的不好的方法:

data class Test(private val _value: Int) {
val value: Int
get() = if (_value < 0) 0 else _value
}

这种方法的问题是 data classes并不是真的要改变这样的数据。它们实际上只是用于保存数据。像这样覆盖数据类的 getter 意味着 Test(0)Test(-1) 不会彼此 equal 并且会有不同的 hashCode,但是当你调用 .value 时,它们会得到相同的结果。这是不一致的,虽然它可能对您有用,但您团队中的其他人看到这是一个数据类,可能会在没有意识到您如何更改它/使其无法按预期工作的情况下意外滥用它(即这种方法不会'不能在 MapSet 中正常工作。

关于kotlin - 覆盖 Kotlin 数据类的 getter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38492103/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com