kotlin: by lazy
一,功能
lazy 惰性初始化 的 属性初始化操作 是 提前定义好的 , 在 调用之前 自动进行初始化操作 , 如果不调用 , 则不进行初始化 ;
lateinit 延迟初始化 的 属性初始化操作 , 需要 手动进行初始化 , 如果忘了初始化直接调用就会报错 ;
by lazy 适用于 不可变属性 (val),它的初始化只会在第一次被访问时触发,且结果会被缓存下来,以后每次访问时都返回相同的值。
by lazy 可以用来延迟初始化那些计算量大或依赖其他数据的属性,通常适用于线程安全的场景。
by lazy本身是一种属性委托。属性委托的关键字是by

总结两者区别:
使用 lateinit:适用于那些需要稍后赋值且会被多次修改的对象属性,比如 Android 中的 Context 或 View。
使用 by lazy:适用于那些不需要立即初始化,且一旦初始化后不再改变的只读属性,比如计算密集型或一次性加载的属性。
一般来说的话,lateinit一定要记得初始化,不然后面会爆异常UninitializedPropertyAccessException
二,例子:
代码:
//处理按钮点击事件:
binding.button3.setOnClickListener {
class Hello{
val name by lazy {initName()}
fun initName(): String {
println("初始化 name 属性")
return "Tom"
}
}
// 实例化对象时, name 属性不需要初始化
var hello = Hello()
println("实例对象初始化完毕")
Thread.sleep(1000)
// 在调用 name 属性后, 才初始化 name 属性
println("name = ${hello.name}")
println("name = ${hello.name}")
}
运行结果:

三,例子:
代码:
//处理按钮点击事件
binding.button4.setOnClickListener {
class Example {
val text: String by lazy {
println("开始初始化 text")
"Hello, Lazy!"
}
fun printText() {
println(text) // 第一次访问时初始化
}
}
val example = Example()
example.printText() // 输出:开始初始化 text\nHello, Lazy!
example.printText() // 输出:Hello, Lazy!(不会再初始化)
}
运行结果:

浙公网安备 33010602011771号