我对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
}
答案 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
用于无法在构造函数中初始化的属性。