一、lateinit
用作非空类型的初始化:
- 在使用前需要初始化
- 如果使用时没有初始化内部会抛出
UninitializedPropertyAccessException - 可配合
::xxx.isInitialized在使用前进行检查 - 是个绕过编译器空检查的关键字,除非保证能初始化到,否则不建议用
二、by lazy
用作变量的延迟初始化:
-
定义的时候已经明确了
initializer函数体 -
使用的时候才进行初始化,内部默认
LazyThreadSafetyMode.SYNCHRONIZED模式,通过同步锁和双重校验的方式返回持有的实例,线程安全,但是影响性能。如果没有多线程问题,建议使用LazyThreadSafetyMode.NONE模式。