kotlin延迟初始化

kotlin中的属性在声明的同时必须初始化,否则会报错

 private var name:String // 编译不通过
 private var name2:String? = ""    //编译通过
 private var name3:String? = null  //编译通过

但是有的时候,并不想声明一个可空的对象,而且也不想在声明的时候就直接初始化,那么这时候就需要用到延迟初始化,kotlin有两种延迟初始化的方式:一种是 lateinit var,一种是by lazy。

private lateinit var name:String

lateinit var
lateinit var只能用来修饰类属性,不能用来修饰局部变量,并且只能够修饰对象,不能修饰基本数据类型(因为基本数据类型在类加载的准备阶段就会被初始化为默认值)lateinit var 的作用:让编译器期在检查时不要因为属性变量未初始化而报错
但是当使用lateinit var 的时候,必须在后面合理地时机将该属性对象进行初始化,否则会报错。

by lazy
by lazy本身是一种属性委托。属性委托的关键字是by。by lazy的写法如下:

  private val age:Int by lazy { 1 }
    fun foo(){
        val name:String by lazy {
            "hello"
        }
    }

lateinit var和by lazy使用区别?
虽然两者都可以推迟属性初始化的时间,但是lateinit var只是让编译期忽略对属性未初始化的检查,后续在哪里以及何时初始化还需要开发者自己决定。而by lazy真正做到了声明的同时也指定了延迟初始化时的行为,在属性被第一次被使用的时候能自动初始化。

你可能感兴趣的:(kotlin延迟初始化)