Kotlin - lateinit VS Any? = null

时间:2016-02-29 02:43:28

标签: android kotlin kotlin-null-safety

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

var myObject : Any? = null

var lateinit myObject : Any  

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

3 个答案:

答案 0 :(得分:19)

根据我目前在Kotlin的知识,我会看到差异。

第一个:

var myObject1 : Any? = null

此处myObject1是可以为空的属性。这意味着您可以为其分配null

第二个:

lateinit var myObject2 : Any

此处myObject2是非null属性。这意味着您无法为其分配null。通常,如果属性为非null,则必须在声明处初始化它。但添加关键字lateinit可以推迟初始化。如果在初始化之前尝试访问lateinit属性,则会出现异常。

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

有关详细信息,请查看this

答案 1 :(得分:5)

在引用对象内部字段时,

lateinit关键字用于avoid空检查的字段。当您使用依赖注入初始化变量或在单元测试的setup方法中初始化变量时,主要使用关键字

当字段将在程序中稍后通过setter或对象的方法内部初始化时,

?用于字段,这是为了强制您检查null或使用null安全性( ?.)引用字段时

答案 2 :(得分:1)

如果您的媒体资源不应该是null,但在将来某个时间点之后才设置,则使用lateinit关键字进行声明会更安全。这保证了,如果你在设置它之前访问它,你会得到一个异常解释。

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

>