拆解Kotlin中的by lazy:从语法糖到底层实现
by lazy 是Kotlin中一个强大的属性委托机制,它主要用于实现属性的延迟初始化。所谓延迟初始化,就是在第一次访问该属性时才进行初始化,而不是在对象创建时就立即初始化。这种机制在很多场景下都能带来性能优势,特别是当属性的初始化成本较高或者属性可能不会被使用时。
基本使用示例
class MainActivity : AppCompatActivity() {
private val viewModel by lazy { FooApplication.pollingViewModel }
}
这段代码看似简单,但实际上包含了很多重要的特性:
- 线程安全性:默认情况下是同步的,确保只初始化一次
- 值缓存:初始化后的值会被缓存,后续访问直接返回缓存的值
- 代码简洁:不需要显式处理null检查和初始化逻辑
揭秘by lazy的底层实现
如果不使用 by lazy 这个语法糖,要实现相同的功能,代码会是这样的:
class MainActivity : AppCompatActivity() {
private var _viewModel: PollingViewModel? = null
private val viewModel: PollingViewModel
get() {
if (_viewModel == null) {
synchronized(this) {
if (_viewModel == null) {
_viewModel = FooApplication.pollingViewModel
}
}
}
return _viewModel!!
}
}
这个实现展示了 by lazy 的核心原理:
- 使用可空的后备字段存储实际值
- 通过getter方法控制初始化逻辑
- 使用双重检查锁定模式确保线程安全
- 缓存初始化后的值避免重复计算
参考:
https://juejin.cn/post/7463130840308318245