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