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

Kotlin -> lateinit 和 lazy 详解

lateinitlazy 详解

核心区别

特性lateinitlazy
类型可变属性修饰符 var不可变属性委托 val
初始化时机手动显式初始化,随时可变首次访问时自动初始化,之后不可变
空安全非空类型,但初始值可缺失非空类型,保证有值
适用类型不能用于基本类型(Int, Boolean等)可用于任何类型
线程安全不保证线程安全默认线程安全SYNCHRONIZED模式
检查机制使用前需确保已初始化,否则抛异常自动处理初始化,不会抛出未初始化异常

lateinit 核心用法

// 声明
class User {lateinit var name: Stringfun initialize() {name = "John" // 手动初始化}fun greet() {if (::name.isInitialized) { // 检查是否已初始化println("Hello, $name")}}
}

最佳使用场景:

  • 依赖注入
  • Activity/Fragment中的视图绑定
  • 单元测试的setUp方法中
  • 需要推迟初始化但之后可能需要修改的属性

lazy 核心用法

// 基本用法
class User {val name: String by lazy { println("Computing name...")"John" // 计算并返回初始值}
}// 指定线程安全模式
val expensiveData: List<Data> by lazy(LazyThreadSafetyMode.PUBLICATION) {loadDataFromDatabase()
}

线程安全模式:

  • SYNCHRONIZED:默认模式,线程安全,只执行一次初始化
  • PUBLICATION:多线程可能执行多次,但只有第一个结果被使用
  • NONE:不保证线程安全,适用于单线程环境,性能最好

最佳使用场景:

  • 计算开销大的属性
  • 需要根据条件计算的只读属性
  • 单例模式实现
  • 配置项和缓存数据

核心实现原理

lateinit

  • 在字节码级别,不为属性分配默认值
  • 访问前不进行空检查
  • 使用前若未初始化,抛出UninitializedPropertyAccessException

lazy

  • 内部使用SynchronizedLazyImpl等实现类
  • 持有一个初始化器函数和一个存储结果的AtomicReference
  • 首次访问时执行初始化器并缓存结果

如何选择

  • 如果属性需要在初始化后修改,使用lateinit var
  • 如果属性是只读的且可以延迟计算,使用lazy val
  • 如果处理基本类型,只能使用lazy
  • 如果在多线程环境中,优先考虑lazy
http://www.xdnf.cn/news/2905.html

相关文章:

  • 嵌入式音视频实时通话EasyRTC打造设备安装与调试的高效远程解决方案
  • Nginx反向代理的负载均衡配置
  • Python入门:流程控制练习
  • 数据编辑器中变量的精妙计算与灵动转换​
  • 汽车启动原理是什么?
  • 水库现代化建设指南-水库运管矩阵管理系统建设方案
  • Linux环境变量的作用以及进程的虚拟地址原理
  • 【Tips】高效文献管理:Zotero 导入参考文献的多种方式详解
  • 【PyTorch动态计算图实战解析】从原理到高效开发
  • CSS in JS:机遇与挑战的思考
  • Java | 韩顺平 循序渐进学Java自用笔记---OOP高级
  • EPSG的作用
  • C++23中的std::forward_like:完美转发的增强
  • 第十六届蓝桥杯 2025 C/C++B组第一轮省赛 全部题解(未完结)
  • 探索目标检测:边界框与锚框的奥秘
  • leetcode 21. 合并两个有序链表(c++解法+相关知识点复习)
  • 目标检测和目标跟踪的区别与联系
  • 大前端开发——前端知识渐变分层讲解 利用金字塔原理简化前端知识体系
  • 长短期记忆网络(LSTM)
  • MySQL多表操作
  • Ansible 铸就 Linux 安全之盾(Ansible Builds Linux Security Shield)
  • 《软件测试52讲》学习笔记:如何设计一个“好的“测试用例?
  • 【学习资源】知识图谱与大语言模型融合
  • 在Mybatis中写sql的常量应用
  • 万物皆可执行:多功能机器人正在定义新生产力法则
  • Ceph IO读写流程详解(二)——RADOSGW请求处理
  • Lightroom 2025手机版:专业编辑,轻松上手
  • 基于 STM32 的智慧图书馆智能控制系统设计与实现
  • DeepSeek破界而来:重构大规模深度检索的算力与边界
  • Java云原生+quarkus