Kotlin中修改依赖变量后,如何自动重新计算结果变量?
在Kotlin中自动更新依赖变量的计算结果
在Kotlin中,你可以通过以下几种方案实现依赖变量更新时自动重新计算result,避免重复编写赋值代码:
1. 带自定义getter的只读属性(最简单)
将result定义为带自定义getter的val,每次访问该属性时都会自动执行计算逻辑:
var valueA = 9 var valueB = 10 val result get() = valueA * valueB println(result) // 输出 90 valueA = 15 println(result) // 输出 150
适用场景:计算逻辑简单、耗时低的场景。缺点是每次访问result都会重新计算,如果计算成本高会影响性能。
2. 利用Observable属性触发更新
如果计算逻辑较重,不想每次访问都重复计算,可以用Delegates.observable监听valueA和valueB的变化,在变量修改时主动更新result:
import kotlin.properties.Delegates var valueA by Delegates.observable(9) { _, _, _ -> result = valueA * valueB } var valueB by Delegates.observable(10) { _, _, _ -> result = valueA * valueB } var result = valueA * valueB println(result) // 90 valueA = 15 println(result) // 150 valueB = 20 println(result) // 300
适用场景:计算成本高的场景,只会在依赖变量修改时执行一次计算。
3. 自定义属性委托(高复用性)
如果需要在多个地方复用这种“依赖变量自动更新”的逻辑,可以自定义一个属性委托类:
import kotlin.properties.Delegates class AutoComputed<T>(private val compute: () -> T) { private var currentValue: T = compute() fun bindTo(vararg observables: Delegates.ObservableProperty<*>) { observables.forEach { observable -> observable.addChangeListener { _, _, _ -> currentValue = compute() } } } operator fun getValue(thisRef: Any?, property: kotlin.reflect.KProperty<*>): T { return currentValue } } // 使用示例 var valueA by Delegates.observable(9) { _, _, _ -> } var valueB by Delegates.observable(10) { _, _, _ -> } val result = AutoComputed { valueA * valueB }.apply { bindTo(valueA, valueB) } println(result) // 90 valueA = 15 println(result) // 150 valueB = 20 println(result) // 300
这个方案把自动计算的逻辑封装起来,方便在多个地方复用,同时保留了“仅在依赖变化时计算”的性能优势。
内容的提问来源于stack exchange,提问作者Илья Мисников
相关产品推荐
相关产品推荐

