Kotlin - lateinit VS Any?= null

fer*_*dev 17 android kotlin kotlin-null-safety

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

var myObject : Any? = null
Run Code Online (Sandbox Code Playgroud)

要么

var lateinit myObject : Any  
Run Code Online (Sandbox Code Playgroud)

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

dis*_*han 20

以下是根据我目前在Kotlin的知识看到的差异.

第一:

var myObject1 : Any? = null
Run Code Online (Sandbox Code Playgroud)

myObject1是一个可以为空的属性.这意味着你可以分配null给它.

第二个:

lateinit var myObject2 : Any
Run Code Online (Sandbox Code Playgroud)

myObject2是一个非null属性.这意味着你无法分配null它.通常,如果属性为非null,则必须在声明处初始化它.但添加关键字lateinit可以推迟初始化.如果lateinit在初始化之前尝试访问该属性,则会出现异常.

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

欲了解更多信息检查这个.


Kev*_*ain 5

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

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