Kotlin:关键字之lateinit

Kotlin中定义变量或者属性都是需要初始化值的,并且其都是private的,但是有些时候对于变量或者属性只需要声明,但是不需要初始化,则kotlin提供了lateinit关键字来实现:

class Student {
    
    lateinit var name: String
    var address :String = "北京"
    lateinit val sex :String 

    lateinit var age: Int
    lateinit var sorce : Double 

    var studentNumber1 :Int
    var studentNumber2 :Int = 0
}

Kotlin:关键字之lateinit从上图可以看出编辑器所出现的错误可以总结出在使用lateinit是需要注意的事项:


lateinit 对应使用var来声明属性

lateinit 不可以修饰原始数据类型(byte,char,short ,int,long,float,double)

1

2

也许有人会问到为什么为什么不可以修饰原始数据类型


对于对象类型,Kotlin使用 null 值,以标记 lateinit 属性尚未初始化,并在访问该属性时引发适当的异常。

对于原始类型,没有这样的值,因此无法将属性标记为未初始化并提供的诊断信息lateinit 需要提供。 (我们可以尝试使用某种单独的标记,但是在通过反射初始化字段时不会更新该标记,这是 lateinit 的主要用例)。


因此,仅对象类型的属性支持 lateinit


但是


lateinit 是一个坑,对于新手来说还是一个不小的坑


在 Kotlin 代码中慎用 lateinit 属性


这位作者解释的很清楚了


对于 Kotlin 新手来说,应该抛开 Java 式的写法,牢记类属性的三种初始化方式:


主构造函数内定义属性,使用传入的参数初始化属性;

类体内定义属性,同时初始化;

类体内定义属性,init 块里初始化。

最后再提一下Kotlin lateinit 和 by lazy 的区别:

1.lazy{} 只能用在val类型, lateinit 只能用在var类型 如 :

val name: String by lazy { “sherlbon” }

lateinit var adapter: MyAdapter12


2.lateinit不能用在可空的属性上和java的基本类型上 如:

lateinit var age: Int //会报错1


3.lateinit可以在任何位置初始化并且可以初始化多次。而lazy在第一次被调用时就被初始化,想要被改变只能重新定义

4.lateinit 有支持(反向)域(Backing Fields)


上一篇:好雨·云市正式发布,用户可自主生产和自助使用SaaS服务


下一篇:CSDN博客导出工具 mac