Kotlin - 如何在"lateinit"和"nullable variable"之间做出决定?

par*_*ril 27 android kotlin

我对lateinit和nullable变量感到困惑,哪一个用于变量.

lateinit var c: String
var d: String? = null
c = "UserDefinedTarget"

// if not added initialisation for c than throws UninitializedPropertyAccessException
if (c == "UserDefinedTarget") {
    //do some stuff.
}
//not throws any exception whether d is initialise or not.
if(d == "UserDefinedTarget") {
     //do some stuff
}
Run Code Online (Sandbox Code Playgroud)

ale*_*lex 22

可以为空的类型就是具有null的有效状态的东西.

不可为空的晚期init var表示null为无效状态,但由于某种原因,您无法在构造函数中填充它.

Android活动是使用lateinit的一个很好的例子.活动必须有一个no args构造函数,它们的生命周期才真正以onCreate()开头.

  • `lateinit` 只是为了避免将来进行 null 检查,这就是为什么 `lateinit` 修饰符不允许出现在可空类型的属性上。 (3认同)

Ale*_*nov 15

这是两个完全不同的概念.

您可以在引用属性时使用lateinit以避免空检查.如果通过依赖注入初始化属性,或者例如在单元测试的设置方法中,则非常方便.

但是,您应该记住,lateinit在初始化之前访问属性会引发异常.这意味着只有在您完全确定时才会使用它们,它们被初始化.

另一方面,当变量可以容纳 时,可以使用可空类型null.


class A {
    lateinit var a: String

    fun cat() {
        print(a.length)  // UninitializedPropertyAccessException is thrown
        a = "cat"
        print(a.length)  // >>> 3
    }
}

class B {
    var b: String? = null

    fun dog() {
        print(b.length)  // won't compile, null check is obligatory here
        print(b?.length) // >>> null
        b = "dog"
        print(b?.length) // >>> 3
    }
}
Run Code Online (Sandbox Code Playgroud)

欲获得更多信息:


Vad*_*ovs 9

这取决于.可空变量意味着变量可以保持值或null.lateinit表示必须稍后初始化变量.它应该在访问之前初始化.如果您尝试访问未初始化的lateinit变量UninitializedPropertyAccessException将被抛出.

避免在应用中使用空值总是更好.空虚是邪恶的.因此,如果您可以初始化变量,onCreate那么最好使用它lateinit.此外,如果您在应用程序中使用依赖项注入并且应该注入字段,那么它也是一个有效的案例,lateinit而不是处理空值.

如果由于某种原因您无法初始化变量,初始化代码可能会导致null,或者可以在您使用可空变量之后将null分配给此变量.一般来说,如果null是变量的有效值.