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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 23:36:02