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

Kotlin中lazyVar是什么?附测试代码请求解析

Kotlin中的lazyVar是什么?

Kotlin标准库并没有内置lazyVar这个属性委托,它是一个自定义实现的委托工具,核心作用是实现「支持重新赋值的懒加载属性」——刚好弥补了标准库lazy委托的局限:标准lazy只能用于只读的val属性,初始化后无法修改,而lazyVar适配可变的var属性,既保留懒加载(第一次访问才执行初始化逻辑),又允许后续赋值覆盖初始值。

测试代码逻辑解析

你提供的测试代码里,lazyVar的行为可以拆解为:

  1. 声明testVar时,通过by lazyVar { "initial" }绑定委托,此时"initial"对应的lambda并不会立即执行
  2. 第一次访问testVar时,委托会执行初始化lambda,把返回的"initial"赋值给属性,所以第一个断言通过
  3. 执行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 04:48:19