我正在测试Android上的kotlin并遇到一个问题,即两个变量的setter在无限递归中被调用,因为它们在最初设置时会尝试互相更改。
以下是示例代码
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
它最终导致infinte递归并最终导致stackoverflow。 b
的setter会调用a
的setter,后者又会再次调用b
的setter。它永远持续下去。
我希望每当设置b
时都能更新a
的值,但每当a
设置时,我也会更新b
的值。
Kotlin专家的任何想法都在那里?在这种情况下,我是否需要使Java像setter一样,这样每当我为a
或b
赋值时,我的setter代码都不会被调用。或者我可以使用一些漂亮的Kotlin善良吗?
答案 0 :(得分:6)
对于此示例,您只能计算其中一个属性,例如
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不会为这些属性生成自己的支持字段,因为它们从未被使用过。