在 Kotlin 中,似乎有两种方法可以在对象内部声明一个变量,该变量可以为 null 并在对象创建后实例化。
var myObject : Any? = null
或者
var lateinit myObject : Any
如果我们可以让 var 可以为空并稍后分配它,我对为什么需要 lateinit 关键字感到困惑。每种方法的优缺点是什么,每种方法应该在什么情况下使用?
在 Kotlin 中,似乎有两种方法可以在对象内部声明一个变量,该变量可以为 null 并在对象创建后实例化。
var myObject : Any? = null
或者
var lateinit myObject : Any
如果我们可以让 var 可以为空并稍后分配它,我对为什么需要 lateinit 关键字感到困惑。每种方法的优缺点是什么,每种方法应该在什么情况下使用?
根据我目前对 Kotlin 的了解,这是我如何看待差异的。
第一:
var myObject1 : Any? = null
这myObject1
是一个可以为空的属性。这意味着您可以分配null
给它。
第二个:
lateinit var myObject2 : Any
这myObject2
是一个非空属性。这意味着您不能分配null
给它。通常如果一个属性是非空的,你必须在声明时初始化它。但是添加关键字lateinit
可以让您推迟初始化。lateinit
如果您在初始化之前尝试访问该属性,则会出现异常。
简而言之,主要区别在于它myObject1
是可空的并且myObject2
是非空的。关键字lateinit
为您提供了一种便利机制,允许稍后初始化非空属性,而不是在声明时对其进行初始化。
有关更多信息,请查看此。
lateinit
在引用对象内部的字段时,在字段上使用关键字进行avoid
空检查。该关键字主要在使用依赖注入初始化变量时使用,或者在单元测试的 setup 方法中初始化变量时使用
?
当字段稍后将在程序中由 setter 或对象的方法内部初始化时,用于字段,这是为了强制您?.
在引用字段时检查 null 或使用 null 安全性()
如果您的属性不应该是,但只是在未来某个时间点之后没有设置,那么使用关键字null
声明它会更安全。lateinit
这保证了,如果您在设置之前访问它,您会得到一个异常解释。
传统的 Java 方法是抛出一个泛型NullPointerException
而不做任何解释。如果您自己编写代码,您可能会有线索,但如果其他人发现错误,则不清楚为什么该特定变量是null
.