Kotlin – 如何决定“lateinit”和“可空变量”?

我很迷惑lateinit和可空变量,哪一个用于变量。

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 } 

一个可为空的类型就是这样,一个有效状态为null的事物。

一个不可空的晚期初始化var表示null是一个无效的状态,但由于某种原因,你不能在构造函数中填充它。

Android Activities是使用lateinit的一个很好的例子。 活动必须有一个无参数构造函数,其生命周期只能从onCreate()开始。

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

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

但是,您应该记住,在初始化之前访问lateinit属性将引发一个exeption。 这意味着你只有在你确定的时候才能使用它们,它们被初始化。

另一方面,当一个变量可以为 null时,可以使用 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 } } 

了解更多信息:

  • 后期初始化的属性
  • 可空类型

这取决于。 可为空的变量表示变量可以保存值或为空。 lateinit意味着变量必须稍后被初始化。 在访问它之前应该进行初始化。 如果尝试访问未初始化的lateinit变量,将引发lateinit

避免在您的应用中使用空值总是更好。 空是邪恶的。 所以如果你可以在onCreate初始化变量,那么最好使用lateinit 。 另外,如果您在应用程序中使用依赖注入,并且应该注入字段,那么使用lateinit而不是处理空值也是有效的情况。

如果由于某种原因,你不能初始化变量,初始化代码可能会导致null,或者null应该使用空的变量来分配给这个变量。 一般来说,如果null是变量的有效值。