给定以下 Kotlin 类:
data class Test(val value: Int)
我将如何覆盖Int
getter 以便如果值为负数则返回 0?
如果这是不可能的,有哪些技术可以达到合适的结果?
在花了几乎一整年的时间每天编写 Kotlin 后,我发现尝试像这样覆盖数据类是一种不好的做法。有 3 种有效的方法,在我介绍它们之后,我将解释为什么其他答案建议的方法不好。
拥有创建的业务逻辑data class
在使用错误值调用构造函数之前,将该值更改为 0 或更大。这可能是大多数情况下的最佳方法。
-
不要使用data class
。使用常规的class
并让您的 IDE 生成equals
and hashCode
适合您的方法(或者如果您不需要它们,则不需要)。是的,如果对象的任何属性发生更改,您将必须重新生成它,但您可以完全控制该对象。
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()
}
}
-
在对象上创建一个额外的安全属性来执行您想要的操作,而不是使用有效覆盖的私有值。
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
}
这种方法的问题在于数据类 https://kotlinlang.org/docs/reference/data-classes.html实际上并不是为了像这样改变数据。它们实际上只是用于保存数据。重写像这样的数据类的 getter 意味着Test(0)
and Test(-1)
不会equal
彼此之间会有不同的hashCode
s,但是当你打电话时.value
,他们会得到相同的结果。这是不一致的,虽然它可能对您有用,但您团队中的其他人看到这是一个数据类,可能会意外地误用它,而没有意识到您如何更改它/使其无法按预期工作(即,这种方法不会t 正常工作Map
or a Set
).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)