Kotlin中val变量关联可变变量实现值实时同步的方案咨询
问题核心原理
你最初的代码无法实现同步的原因是:Kotlin中对Int等基础类型的直接赋值是值拷贝,val b = a执行时只会将a当前的数值复制给b,后续a的修改不会影响已经完成赋值的b。
你遇到的匿名对象x无法访问的问题,是因为Kotlin对顶级作用域的匿名对象默认会向上推导为Any类型,只有局部作用域内的匿名对象才会保留其自定义成员的可访问性。
实现方案(无需@Synchronized注解)
方案1:自定义val的getter(最简单,完全符合需求)
直接让val b每次被访问时都返回a的当前值,不需要额外的对象包装:
var a = 350 // b是val类型,每次访问都会读取a的最新值 val b: Int get() = a a = 8 println(b) // 输出8
方案2:显式声明包装类型解决匿名对象成员访问问题
如果你需要用对象包装的场景,先显式声明包含目标属性的接口/类,就可以在任意作用域访问成员:
// 先定义属性契约 interface Wrapper { var x: Int } val object1: Wrapper = object : Wrapper { override var x = 350 } // object2是val,仅保存对象引用,和object1指向同一块内存 val object2 = object1 object1.x = 8 println(object2.x) // 输出8
多线程场景优化(如果需要线程安全)
如果有并发修改的需求,不需要给整个函数加@Synchronized,直接用原子类即可:
import java.util.concurrent.atomic.AtomicInteger var a = AtomicInteger(350) val b: Int get() = a.get() a.set(8) println(b) // 输出8,线程安全
内容的提问来源于stack exchange,提问作者Inès Belhouchet
相关产品推荐
相关产品推荐

