2016-02-29 70 views
12

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

var myObject : Any? = null 

var lateinit myObject : Any 

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

回答

13

下面是我如何看到根据我目前在Kotlin的知识的差异。

第一招:

var myObject1 : Any? = null 

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

第二个:

lateinit var myObject2 : Any 

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

总之主要区别在于myObject1是可以为空并且myObject2是非空值。关键字lateinit为您提供了一种便利机制,允许在以后初始化非空属性,而不是在声明中初始化它。

欲了解更多信息,请查阅this

4

lateinit关键字在字段中使用到avoid当引用对象内部的字段时使用空检查。当您使用依赖注入来初始化变量或者在单元测试的设置方法中初始化变量时,主要使用关键字

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

1

如果你的财产不应该是null,但只是没有设置后在将来的某个时候,用lateinit关键字声明它更安全。这就保证了,如果你在设置它之前访问它,你会得到一个异常的解释。

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

相关问题