第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解决"初始化逻辑 + 只做一次 + 线程安全"。