Kotlin - lateinit VS 任何? =空

Posted

技术标签:

【中文标题】Kotlin - lateinit VS 任何? =空【英文标题】:Kotlin - lateinit VS Any? = null 【发布时间】:2016-06-11 23:52:15 【问题描述】:

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

var myObject : Any? = null

var lateinit myObject : Any  

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

【问题讨论】:

【参考方案1】:

根据我目前在 Kotlin 中的知识,这是我对差异的看法。

第一个:

var myObject1 : Any? = null

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

第二个:

lateinit var myObject2 : Any

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

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

更多信息请查看this。

【讨论】:

那么活动的上下文属于不可为空还是可以为空的属性?【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于Kotlin - lateinit VS 任何? =空的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin Autowired 问题 - lateinit (obv)

Kotlin基础 3.关键字:lateinit(更新中)

使用“by lazy”与“lateinit”进行属性初始化

Dagger2 + Kotlin:lateinit 属性尚未初始化

kotlin.UninitializedPropertyAccessException:lateinit 属性尚未初始化

Kotlin基础 关键字:lateinit和by lazy