kotlin setter无限递归

时间:2017-08-21 00:07:52

标签: 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
        }
}

然后我说使用以下代码:

val example = Example()
example.a = 10

它最终导致infinte递归并最终导致stackoverflow。 b的setter会调用a的setter,后者又会再次调用b的setter。它永远持续下去。

我希望每当设置b时都能更新a的值,但每当a设置时,我也会更新b的值。

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

1 个答案:

答案 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不会为这些属性生成自己的支持字段,因为它们从未被使用过。