拆解Kotlin中的by lazy:从语法糖到底层实现

by lazy 是Kotlin中一个强大的属性委托机制,它主要用于实现属性的延迟初始化。所谓延迟初始化,就是在第一次访问该属性时才进行初始化,而不是在对象创建时就立即初始化。这种机制在很多场景下都能带来性能优势,特别是当属性的初始化成本较高或者属性可能不会被使用时。

基本使用示例

bash 复制代码
class MainActivity : AppCompatActivity() {
    private val viewModel by lazy { FooApplication.pollingViewModel }
}

这段代码看似简单,但实际上包含了很多重要的特性:

  1. 线程安全性:默认情况下是同步的,确保只初始化一次
  2. 值缓存:初始化后的值会被缓存,后续访问直接返回缓存的值
  3. 代码简洁:不需要显式处理null检查和初始化逻辑

揭秘by lazy的底层实现

如果不使用 by lazy 这个语法糖,要实现相同的功能,代码会是这样的:

bash 复制代码
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

相关推荐
杊页3 分钟前
系列一:架构思想进阶 | 第2篇 分层架构实战:四层拆分、单向依赖与架构防腐
android
Ada's15 分钟前
【计算机基础系列】python语言:环境搭建
开发语言·python
weiggle17 分钟前
第四篇:布局系统——从 Row、Column 到 Box 的声明式布局思维
android
xiaoshuaishuai817 分钟前
C# Avalonia UI的ItemControl
开发语言·ui·c#
未若君雅裁17 分钟前
JMM、volatile 与 CAS:并发安全三大问题
java·开发语言
hai31524754318 分钟前
# 矩阵算法·算子对齐工具 v6.1 — 技术规格与使用手册
java·开发语言·驱动开发·神经网络·spring·目标检测·矩阵
用户860225046747219 分钟前
Now in Android 架构深度解析
android
杊页23 分钟前
系列一:架构思想进阶 | 第1篇 Android 架构演进实录:从 MVC 的“万能类”到 MVVM 的数据驱动
android
曾几何时`25 分钟前
Go(三)GC垃圾回收
开发语言
并不喜欢吃鱼26 分钟前
一.C++11:统一列表初始化 + std::initializer_list 超详细精讲
开发语言·c++