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

时间:2017-06-28 07:25:42

标签: 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
}

4 个答案:

答案 0 :(得分:18)

可以为空的类型就是那个有效状态为null的东西。

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

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

答案 1 :(得分:12)

  

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

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

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

另一方面,

Nullable类型在变量可以容纳 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
    }
}

了解更多信息:

答案 2 :(得分:7)

这取决于。 可空变量意味着变量可以保持值或null。 main => L = read_line(), B = round(L.length/2), S = L.slice(1,B), println(S). 表示变量必须稍后初始化。它应该在访问之前初始化。如果您尝试访问未初始化的lateinit变量lateinit将被抛出。

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

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

答案 3 :(得分:2)

lateinit用于无法在构造函数中初始化的属性。