kotlin 中 懒加载 方式
lateinit 和 by lazy 不同的是 by lazy 修饰符是 val(线程安全),lateinit 是var。
lateinit 关键字 不需要 初始化赋值,在使用变量之前需要赋值,否则会抛出 异常 lateinit property lateStr has not been ,使用方式:
lateinit var lateStr:String 或者 lateinit var lateStr:Any
扩展:当我们不确定变量类型的时候
lateinit var ltInit:Any
ltInit=设置基本类型值
when(ltInit){
is Int -> Log.w("Tag","我是Int===>$ltInit")
is Float ->Log.w("Tag","我是Float===>$ltInit")
is String -> Log.w("Tag","我是String===>$ltInit")
is Boolean -> Log.w("Tag","我是Boolean===>$ltInit")
}
by lazy 关键字,第一次使用时 初始化对象。使用方式:(注意扩展使用方式)
val byStr by lazy{
/**
*没有定义返回类型,返回值可以是任意类型。
*可查看扩展使用方式。
*/
"此处做处理 返回需要的 信息"
}
val byStr:Int by lazy{
/**
*如果定义了类型 返回值只能是 定义类型的属性。
*/
Int.MAX_VALUE
}
扩展:当我们使用SharedPreferences 可封装成
private val prefs: SharedPreferences by lazy {
MyApplication.getContext().getSharedPreferences(name, Context.MODE_PRIVATE)
}
private val prefs by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
MyApplication.getContext().getSharedPreferences(name, Context.MODE_PRIVATE)
}
上面两种使用方式区别 在于 lazy构造函数的不同,第二种代码传入了LazyThreadSafetyMode.SYNCHRONIZED
LazyThreadSafetyMode 枚举函数的意义:
LazyThreadSafetyMode.SYNCHRONIZED:初始化属性时会有双重锁检查,保证该值只在一个线程中计算,并且所有线程会得到相同的值。
LazyThreadSafetyMode.PUBLICATION:多个线程会同时执行,初始化属性的函数会被多次调用,但是只有第一个返回的值被当做委托属性的值。
LazyThreadSafetyMode.NONE:没有双重锁检查,不应该用在多线程下。