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的区别)