Kotlin学习:惰性初始化

date
Jun 12, 2023
slug
35
status
Published
tags
Android
Kotlin
summary
惰性初始化是一种在需要时才初始化对象或变量的方式。
type
Post
Book
惰性初始化是一种在需要时才初始化对象或变量的方式。使用by lazy,可以将对象或变量的初始化延迟到第一次访问时。这意味着,如果某个对象或变量从未被访问过,它就不会被初始化。但要注意的是,by lazy在这里并不是连在一起的关键字,只有by才是Kotlin的关键字,lazy在这里只是一个高阶函数。

by lazy是怎么工作的?

它的基本语法结果如下:
val p by lazy {
	...
}
lazy函数中会创建并返回一个Delegate对象,当我们调用p属性的时候,其实调用的是Delegate对象的getValue()方法,然后getValue()方法中又会调用lazy函数传入的Lambda表达式。这样表达式中的代码就可以得到执行,并且调用p属性后得到的值就是Lambda表达式中最后一行代码的返回值。

有什么好处?

初始化代码只会在第一次访问myVariable时执行,而不是在对象创建时执行。这种延迟初始化的方式可以提高应用程序的性能和效率,尤其是对于一些比较耗时的初始化操作。

为什么必须是不可变的?

实现惰性初始化的对象或变量必须是不可变(即使用val关键字声明的)。
原因:
  1. 确保线程安全。如果惰性初始化的对象是可变的,那么在多线程环境中就可能出现竞态条件(Race Condition),从而导致应用程序的不稳定和不安全。而如果对象是不可变的,那么在多线程环境中就可以放心地共享,不必担心线程安全的问题。
  1. 确保只初始化一次。如果惰性初始化的对象是可变的,那么就可能在多次访问时重复初始化,从而浪费系统资源并降低应用程序的性能。而如果对象是不可变的,那么在第一次访问时就可以初始化,并且在以后的访问中不会再次初始化,可以避免重复初始化的问题。
  1. 增强代码清晰度。如果惰性初始化的对象是可变的,那么就可能在不同的访问中出现不同的值,从而增加代码的复杂度和难度。而如果对象是不可变的,那么它的值在初始化后就不会再改变,可以减少代码的复杂度和难度,从而增强代码的清晰度和可读性。

© LewisWong 2021 - 2026