You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin属性setter引发StackOverflowError问题及解决咨询

解决Kotlin Mutex类递归赋值导致的StackOverflowError问题

问题原因

你的代码中,当调用mutex.a = "A"时,会触发a的setter方法,里面执行this.b = null——这行代码本质是调用b的setter;而b的setter里又执行this.a = null,再次触发a的setter。如此循环往复,方法调用栈不断加深,最终触发StackOverflowError。

解决方法

核心思路是修改另一个属性时,不通过它的public setter,而是直接操作底层存储变量,避免触发递归调用。

方案:使用私有幕后字段

将实际存储值的变量设为私有,公开的a和b通过自定义getter/setter操作这些私有变量,这样修改时不会触发对方的setter:

class Mutex {
    // 私有变量存储实际值,不会触发任何setter逻辑
    private var _a: String? = null
    private var _b: String? = null

    var a: String?
        get() = _a
        set(value) {
            _b = null // 直接修改私有变量,不触发b的setter
            _a = value
        }

    var b: String?
        get() = _b
        set(value) {
            _a = null // 直接修改私有变量,不触发a的setter
            _b = value
        }
}

这样调用mutex.a = "A"时,只会修改_b的取值,不会触发b的setter,自然不会引发递归调用栈溢出的问题。

内容的提问来源于stack exchange,提问作者Galudisu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 00:46:03