如果不想在一开始就初始化一个属性,那么你可以使用下面两个关键字。 ① lateinit ② lazy
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()是一个函数,它接受一个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)字段,因此不能保证不可变性。