当前位置: 首页 > article >正文

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

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

基本使用示例

class MainActivity : AppCompatActivity() {
    private val viewModel by lazy { FooApplication.pollingViewModel }
}

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

  1. 线程安全性:默认情况下是同步的,确保只初始化一次
  2. 值缓存:初始化后的值会被缓存,后续访问直接返回缓存的值
  3. 代码简洁:不需要显式处理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


http://www.kler.cn/a/537242.html

相关文章:

  • 部署LLM模型到云端
  • 二叉树实现(学习记录)
  • javaEE-6.网络原理-http
  • web-文件上传-CTFHub
  • 基础篇05-直方图操作
  • UG NX二次开发(Python)-API函数介绍与应用实例(三)-UFLayer类操作
  • x64、aarch64、arm与RISC-V64:详解四种处理器架构
  • 杂乱果园环境中自主农业车辆地头转弯的高效安全轨迹规划
  • vmware ubuntu 扩展硬盘系统文件大小
  • Android修行手册-五种比较图片相似或相同
  • 数据分析:pandas.skew 复现
  • 每日一题——使用快排实现寻找第K大元素
  • python学opencv|读取图像(五十八)使用cv2.erode()函数实现图像腐蚀处理
  • Windows Docker笔记-在容器中运行项目
  • windows下搭建鸿蒙OS应用开发环境
  • Linux运维——文件内容查看编辑
  • 用AI写游戏1——js实现贪吃蛇
  • 2025.2.5——五、[网鼎杯 2020 青龙组]AreUSerialz 代码审计|反序列化
  • AlphaGPT获国家AIGC生成式算法备案,推动法律AI技术安全合规发展
  • Linux之kernel(7)系统调用源码分析
  • 三轴云台之加速度计篇
  • 大规模多准则决策模型构建详细方案
  • 轻量级服务器http-server
  • 仓颉编程语言:编程世界的 “文化瑰宝”
  • iOS三方登录 - Facebook登录
  • es6中关于symbol的用法,以及使用场景