lazy
和 lateinit
是Kotlin中两种不同的延迟初始化技术
lazy(懒初始化)
只能用于 val
修饰的变量
val myUtil by lazy {
MyUtil(parameter1, parameter2)
}
创建了一个 MyUtil
类型的对象。但这只会发生在第一次使用 myUtil
的时候。
使用场景:
- 单例变量构建(if-null-then-init-else-return)
MyUtil getMyUtil() {
if (myUtil == null) myUtil = new MyUtil(param1, param2);
return myUtil;
}
lateinit(延迟初始化)
只能用于 var
修饰的变量
lateinit var myUtil: MyUtil
在后续某个时机去初始化 myUtil
, 分离了变量的初始化和定义
如何选择:
如果是值可修改的变量(即在之后的使用中可能被重新赋值),使用 lateInit 模式
如果变量的初始化取决于外部对象(比如网络接口数据),使用 lateInit 模式,能较好的检查数据是否是Null
如果变量仅仅初始化一次并且全局共享,且更多的是内部使用(依赖于类内部的变量),使用 lazy 模式。