在Android开发中,需要进行大量的变量声明与初始化,有时候我们并不需要立即初始化,在java开发中就会造成项目出现null指针异常导致项目崩溃的情况,而kotlin的null安全解决了大部分因null指针异常导致崩溃的情况。
因kotlin空安全检查严格,所以变量用以下方式声明就会出错:
var test : String
这样声明,编译器会提示出错,就得声明为null:
var test : String ? = null
这样虽然编译通过了,但在使用该变量时就需要在后面加入"?"和"!!",如果使用了"!!"出现null指针就会导致项目崩溃
这就可以使用Lateinit声明来解决以上问题:
lateinit var test : String
使用该声明形式就可以解决使用变量在后面加入"?"和"!!"的情况,但如果没有初始化也会导致项目崩溃,这就需要以下方法来判断是否初始化:
this::test.isInitialized
加入这个后就可以避免未初始化导致崩溃,但这样在使用时也需要加入!this::test.isInitialized进行判断,也很麻烦这个时候使用lazy来解决以上问题:
val test : String by lazy {
"test"
}
使用lazy可以在第一次使用该变量时,执行内部的方法体进行初始化,如果没有执行该变量就不会运行方法体的内容,不会出现前面两点的缺点了,但使用lazy就必须使用val,这样就不能进行重新初始化了,所以在开发中就需要根据自身情况进行使用,在Android开发中还可以使用lifecycleAwareLazy进行声明初始化,可以根据生命周期赋予不同的值解决了val不能重新初始化的部分问题。