繁体   English   中英

Kotlin - lateinit VS Any? = null

[英]Kotlin - lateinit VS Any? = null

在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属性。 这意味着你不能为它分配null 通常,如果属性为非null,则必须在声明处初始化它。 但添加关键字lateinit允许您推迟初始化。 如果在初始化之前尝试访问lateinit属性,则会出现异常。

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

有关详细信息,请检查

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM