Kotlin中lazyVar是什么?附测试代码请求解析
Kotlin中的lazyVar是什么?
Kotlin标准库并没有内置lazyVar这个属性委托,它是一个自定义实现的委托工具,核心作用是实现「支持重新赋值的懒加载属性」——刚好弥补了标准库lazy委托的局限:标准lazy只能用于只读的val属性,初始化后无法修改,而lazyVar适配可变的var属性,既保留懒加载(第一次访问才执行初始化逻辑),又允许后续赋值覆盖初始值。
测试代码逻辑解析
你提供的测试代码里,lazyVar的行为可以拆解为:
- 声明
testVar时,通过by lazyVar { "initial" }绑定委托,此时"initial"对应的lambda并不会立即执行 - 第一次访问
testVar时,委托会执行初始化lambda,把返回的"initial"赋值给属性,所以第一个断言通过 - 执行
testVar = "test"时,委托会直接更新内部维护的属性值,所以第二个断言也能通过
模拟lazyVar的实现逻辑
你可以参考下面的极简实现来理解它的原理:
import kotlin.properties.ReadWriteProperty import kotlin.reflect.KProperty fun <T> lazyVar(initializer: () -> T): ReadWriteProperty<Any?, T> { var cachedValue: T? = null return object : ReadWriteProperty<Any?, T> { // 读取属性时的逻辑 override fun getValue(thisRef: Any?, property: KProperty<*>): T { if (cachedValue == null) { cachedValue = initializer() } return cachedValue!! } // 赋值属性时的逻辑 override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) { cachedValue = value } } }
这个实现里:
- 用
cachedValue存储属性值,初始为null - 第一次调用
getValue时触发初始化lambda,填充cachedValue setValue直接覆盖cachedValue,让后续赋值操作生效
内容的提问来源于stack exchange,提问作者user15369973
相关产品推荐
相关产品推荐

