Kotlin —  lateinit vs lazy

Kotlin属性初始化

如果不想在一开始就初始化一个属性,那么你可以使用下面两个关键字。
① lateinit
② lazy

lateinit

lateinit的意思是后面再初始化。

通常情况下,声明为非null类型的属性必须先初始化。但是,这在有些时候不是很方便。

要处理这种情况,可以使用lateinit修饰符修饰属性。

例如:

public class Main{
    lateinit var user:User
    
    fun init(){
        user=User()
    }

    fun do(){
      user.eat()
    }
    
}

a、lateinit只能用于var声明的类变量,并且属性没有自定义getter或setter方法。
b、属性的类型必须是非空的,并且不能是原始类型。

lazy

lazy的意思是惰性初始化。

lazy()是一个函数,它接受一个lambda并返回一个lazy实例,它可以作为一个实现lazy属性的委托:get()的第一个调用执行传递给lazy()的lambda并记录结果,随后调用get()只返回记录的结果。

例如:

public class User{
  val name:String by lazy {"Android Coder"}
}

因此第一次调用和之后调用,name都会返回“Android Coder

咱们该如何去选择使用它们呢?
① lateinit var 可以从任何你能看到对象的地方初始化。如果你想你的属性从外部被初始化,这时候可以使用lateinit。
② lazy只能用于val属性,而lateinit只能应用于变量。因为它不能应用于final(val)字段,因此不能保证不可变性。

推荐阅读更多精彩内容