kotlin的延迟加载主要有两种:lateinit和lazy;
一、lateinit
在var之前添加lateinit,然后选择你想要的时候,初始化,但是有以下需要注意的地方:
1.lateinit只能修饰变量var,不能修饰常量val;
2.lateinit不能对可空类型使用;
3.lateinit不能对java基本类型使用,例如:Double、Int、Long等。
在调用lateinit修饰的变量时,如果变量还没有初始化,则会抛出未初始化异常,报错
举个栗子🌰:
lateinit var lateStr: String
fun demo() {
//初始化;
lateStr = "hello ! i am lateinit String "
}
二、lazy的使用;
举个栗子🌰先:
val lazyStr :String by lazy {
Log.e("Xiaoya","开始初始化")
"hello ! i am lazy String"
}
使用时,在类型后面加by lazy{}即可,{}中的最后一行代码,需要返回初始化的结果,上述代码中,"hello ! i am lazy String"即为最后初始化的值。下面是lazy的一些注意点:
1、lazy只能对常量val使用,不能修饰变量var
2、lazy的加载时机为第一次调用常量的时候,且只会加载一次(毕竟是个常量,只能赋值一次)
三、区别:
上面简单了解了两种延迟加载的用法 那有什么区别呢?
首先两者的应用场景是略有不同的。
然后,虽然两者都可以推迟属性初始化的时间,但是lateinit var只是让编译期忽略对属性未初始化的检查,后续在哪里以及何时初始化还需要开发者自己决定。
而by lazy真正做到了声明的同时也指定了延迟初始化时的行为,在属性被第一次被使用的时候能自动初始化。但这些功能是要为此付出一丢丢代价的。