资讯详情

第066篇 lateinit 与 by lazy:延迟初始化的适用边界

📅 2026/10/4 21:30:18 | 华诺云谱 👁 阅读
第066篇 lateinit 与 by lazy:延迟初始化的适用边界
lateinit与by lazy是解决同一个问题的两个工具——延迟初始化:有些值在对象构造时还不能确定(依赖注入、框架回调、Bundle 恢复、首次访问才知),但类型上又不能声明成可空。答这题的关键不在语法差异,而在两者的实现机制不同、失败时机不同、适用场景不同,以及一个高频追问:为什么 Kotlin 不给基本类型提供lateinit。先把结论放在前面:lateinit是属性修饰符,只能用于非基本类型的可变属性(var+ 非val+ 非基本类型 + 非nullable),作用是"跳过构造期赋值,改由后续赋值";赋值之前访问会抛UninitializedPropertyAccessException(由Intrinsics.checkNotNull抛出)。by lazy是属性委托,把初始化逻辑封装成一个Lazy对象,内部用双重检查锁 + volatile保证线程安全与可见性,默认SYNCHRONIZED模式。核心差别:lateinit解决"赋值时机在构造之后",by lazy解决"初始化逻辑 + 只做一次 + 线程安全"。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑