kotlin: by lazy

一,功能

lazy 惰性初始化 的 属性初始化操作 是 提前定义好的 , 在 调用之前 自动进行初始化操作 , 如果不调用 , 则不进行初始化 ;

lateinit 延迟初始化 的 属性初始化操作 , 需要 手动进行初始化 , 如果忘了初始化直接调用就会报错 ;

by lazy 适用于 不可变属性 (val),它的初始化只会在第一次被访问时触发,且结果会被缓存下来,以后每次访问时都返回相同的值。
by lazy 可以用来延迟初始化那些计算量大或依赖其他数据的属性,通常适用于线程安全的场景。
by lazy本身是一种属性委托。属性委托的关键字是by

image

总结两者区别:

使用 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}")
        }

运行结果:

image

三,例子:

代码:

        //处理按钮点击事件
        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!(不会再初始化)
        }

运行结果:

image

posted @ 2025-09-06 08:39  刘宏缔的架构森林  阅读(44)  评论(0)    收藏  举报