24

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

var myObject : Any? = null

或者

var lateinit myObject : Any  

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

4

3 回答 3

26

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

第一:

var myObject1 : Any? = null

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

第二个:

lateinit var myObject2 : Any

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

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

有关更多信息,请查看

于 2016-02-29T07:50:35.057 回答
5

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

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

于 2016-02-29T07:59:25.270 回答
1

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

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

于 2016-05-07T18:53:46.867 回答