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
相关产品推荐
相关产品推荐

