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)
Dagger2 + Kotlin:lateinit 属性尚未初始化
kotlin.UninitializedPropertyAccessException:lateinit 属性尚未初始化