Kotlin延迟初始化lateinit和by lazy的区别

延迟初始化
为什么要进行延迟初始化?
kotlin中的属性在声明的同时必须初始化,否则会报错

private var name:String // 编译不通过
private var name2:String? = "" //编译通过
private var name3:String? = null //编译通过
而我们有时候不想要声明一个可空的对象,也不想在声明的时候就直接初始化,这时候就需要用到延迟初始化!

Kotlin的延迟初始化方式?(两种)
lateinit var

by lazy

lateinit var延迟初始化?
private lateinit var name:String
1、lateinit var只能用来修饰类属性,不能用来修饰局部变量,

2、只能够修饰对象,不能修饰基本数据类型(因为基本数据类型在类加载的准备阶段就会被初始化为默认值)

lateinit var 的作用:让编译器期在检查时不要因为属性变量未初始化而报错
但是当使用lateinit var 的时候,必须在后面合理地时机将该属性对象进行初始化,否则会报错。

by lazy延迟初始化?
by lazy本身是一种属性委托。属性委托的关键字是by。

private val age:Int by lazy { 1 }
fun foo(){
val name:String by lazy {
"hello"
}
}
区别比较
虽然两者都可以推迟属性初始化的时间,但是lateinit var只是让编译期忽略对属性未初始化的检查,后续在哪里以及何时初始化还需要开发者自己决定。而by lazy真正做到了声明的同时也指定了延迟初始化时的行为,在属性被第一次被使用的时候能自动初始化。

你可能感兴趣的:(Kotlin延迟初始化lateinit和by lazy的区别)