萌萌の初音
萌萌の初音
发布于 2021-12-02 / 699 阅读
0

Kotlin的Lazy与Lateinit的理解

在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不能重新初始化的部分问题。