Kotlin - lateinit VS Any? = 空

Kotlin - lateinit VS Any? = null

在 Kotlin 中,似乎有两种方法可以在对象内声明变量,该变量可以为 null 并在对象创建后实例化。

var myObject : Any? = null

var lateinit myObject : Any  

如果我们可以让 var 可以为 null 并稍后分配它,我很困惑为什么需要 lateinit 关键字。每种方法的优缺点是什么,应该在什么情况下使用?

根据我目前对 Kotlin 的了解,这是我看到的差异。

第一个:

var myObject1 : Any? = null

这里 myObject1 是一个可以为 null 的 属性。这意味着您可以将 null 分配给它。

第二个:

lateinit var myObject2 : Any

这里myObject2是一个非空的属性。这意味着您不能将 null 分配给它。通常如果 属性 是非空的,你必须在声明时初始化它。但是添加关键字 lateinit 可以推迟初始化。如果您在初始化之前尝试访问 lateinit 属性,则会出现异常。

简而言之,主要区别在于 myObject1 是可空的,而 myObject2 是非空的。关键字 lateinit 为您提供了一种方便的机制,允许稍后初始化非空 属性 而不是在声明时初始化它。

有关更多信息,请查看 this

lateinit 关键字用于在引用对象内部的字段时对字段进行 avoid 空检查。该关键字主要用于依赖注入初始化变量,或者在单元测试的setup方法中初始化变量

? 用于一个字段,当该字段稍后将在您的程序中由 setter 或对象的方法内部初始化时,这是为了强制您检查null 或在引用字段时使用 null safety(?.)

如果您的 属性 不应该是 null,而只是在未来某个时间点之后没有设置,则使用 lateinit 关键字声明它会更安全。这保证了,如果您在设置之前访问它,您将得到一个异常解释。

传统的 Java 方法是抛出一个通用的 NullPointerException,但没有任何解释。如果您自己编写代码,您可能会有线索,但如果其他人发现了错误,就不清楚 为什么 那个特定变量是 null.