我正在Android上测试kotlin,遇到了一个问题,在这个问题中,两个变量的设置程序在无限递归中被调用,因为它们在最初设置时试图相互更改。
下面是一个示例代码
class Example {
var a: Int = 0
set(value) {
b = a+10
}
var b:Int = 0
set(value) {
a = b-10
}
}然后说我使用了以下代码:
val example = Example()
example.a = 10它最终导致无限递归,并最终导致堆栈溢出。b的setter调用a的setter,后者又再次调用b的setter。它将永远持续下去。
我希望能够在设置b时更新a的值,但也希望在设置b时更新a的值。
那边的Kotlin专家有什么想法吗?在这种情况下,我是否需要使Java像setter一样,这样每当我将值赋值给a或b时,就不会调用setter代码。或者我可以用一些漂亮的Kotlin善良的东西?
发布于 2017-08-21 00:16:22
对于这个例子,您只能计算其中一个属性。
var a: Int = 0
var b: Int
get() = 10 - a
set(value) { a = 10 - value }不过,一般而言,Kotlin不提供对其他属性的支持字段的访问。你必须手动写它。
private var _a: Int = 0
var a: Int
get() = _a
set(value) {
_a = value
_b = 10 - value
}
private var _b: Int = 10
var b: Int
get() = _b
set(value) {
_b = value
_a = 10 - value
}Kotlin不会为这些属性生成自己的支持字段,因为它们从未被使用过。
https://stackoverflow.com/questions/45787898
复制相似问题