我对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()开头.
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)
欲获得更多信息:
这取决于.可空变量意味着变量可以保持值或null.lateinit表示必须稍后初始化变量.它应该在访问之前初始化.如果您尝试访问未初始化的lateinit变量UninitializedPropertyAccessException将被抛出.
避免在应用中使用空值总是更好.空虚是邪恶的.因此,如果您可以初始化变量,onCreate那么最好使用它lateinit.此外,如果您在应用程序中使用依赖项注入并且应该注入字段,那么它也是一个有效的案例,lateinit而不是处理空值.
如果由于某种原因您无法初始化变量,初始化代码可能会导致null,或者可以在您使用可空变量之后将null分配给此变量.一般来说,如果null是变量的有效值.
| 归档时间: |
|
| 查看次数: |
7064 次 |
| 最近记录: |