Kotlin – lateinit VS任何? = null
在Kotlin中,似乎有两种方法在对象内部声明一个变量,该变量可以是null,并在创建对象后实例化。
var myObject : Any? = null
要么
var lateinit myObject : Any
我很困惑为什么需要lateinit关键字,如果我们可以让var为空并在稍后分配它。 每种方法的优缺点是什么?每种方法应该在什么情况下使用?
以下是我如何根据我目前在Kotlin的知识来看出差异。
第一:
var myObject1 : Any? = null
这里myObject1
是一个可为空的属性。 这意味着你可以给它分配null
。
第二个:
lateinit var myObject2 : Any
这里myObject2
是一个非null属性。 这意味着你不能给它分配null
。 通常如果一个属性是非空的,你必须在声明中初始化它。 但是添加关键字lateinit
允许您推迟初始化。 如果在初始化之前尝试访问lateinit
属性,则会发生异常。
简而言之,主要的区别是myObject1
是可以为空的, myObject2
是非空的。 关键字lateinit
为您提供了一个方便的机制,允许在以后的时间初始化非null属性,而不是在声明中初始化它。
欲了解更多信息,请查看。
在引用对象内部的字段时,可以使用lateinit
关键字来avoid
空值检查。 关键字主要用于在使用依赖注入初始化变量时,或者在单元测试的设置方法中初始化变量
?
当字段在程序中稍后被setter或者object的方法内部初始化的时候,这个字段会被用来检查null,或者在引用字段的时候使用null safety( ?.
)
如果你的属性不能为null
,但是在将来某个点之后没有设置,用lateinit
关键字来声明它是比较安全的。 这就保证了,如果你在访问它之前访问它,你会得到一个异常的解释。
传统的Java方法是抛出一个通用的NullPointerException
,而没有解释它。 如果您自己编写代码,您可能会有一些线索,但是如果其他人捕捉到错误,则不清楚为什么该特定变量为null
。