文章转自:https://blog.csdn.net/qq_25749749/article/details/109001465
在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
}
从上图可以看出编辑器所出现的错误可以总结出在使用lateinit是需要注意的事项:
lateinit 对应使用var来声明属性
lateinit 不可以修饰原始数据类型(byte,char,short ,int,long,float,double)
也许有人会问到为什么为什么不可以修饰原始数据类型
对于对象类型,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)