kotlin setter无限递归

Man*_*eus 5 android kotlin

我正在测试Android上的kotlin并遇到一个问题,即两个变量的setter在无限递归中被调用,因为它们在最初设置时会尝试互相更改.

这是一个示例代码

class Example {
    var a: Int = 0
        set(value) {
            b = a+10
        }

    var b:Int = 0
        set(value) {
            a = b-10
        }
}
Run Code Online (Sandbox Code Playgroud)

然后说我然后使用以下代码:

val example = Example()
example.a = 10
Run Code Online (Sandbox Code Playgroud)

它最终导致infinte递归并最终导致stackoverflow.用于b调用setter的setter,a而setter 又将setter调用b.它永远持续下去.

我希望能够以更新值ba设置,而且更新的值ab设置.

那里有Kotlin专家的想法吗?在这种情况下,我是否需要使Java像setter一样,这样每当我为aor 赋值时都不会调用我的setter代码b.或者,我可以使用一些漂亮的Kotlin善良吗?

eph*_*ent 6

对于此示例,您只能计算其中一个属性,例如

var a: Int = 0

var b: Int
    get() = 10 - a
    set(value) { a = 10 - value }
Run Code Online (Sandbox Code Playgroud)

但是,一般而言,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
    }
Run Code Online (Sandbox Code Playgroud)

Kotlin不会为这些属性生成自己的支持字段,因为它们从未被使用过.