lateinit和lazy,轻松搞懂这两个Kotlin魔法词的秘密!


在Kotlin中,`lateinit`和`lazy`是两个非常实用的特性,用于处理初始化延迟的问题。`lateinit`关键字允许你在声明变量时不立即初始化,而是在第一次使用时才进行初始化。这对于那些需要在父类中延迟初始化的变量特别有用,尤其是在继承关系中,子类可能需要先调用父类的方法,但父类的某些属性还没有初始化完成。

例如,假设有一个父类`Parent`,其中有一个需要在子类中初始化的属性`childProperty`,你可以这样使用`lateinit`:

```kotlin

open class Parent {

lateinit var childProperty: Child

}

class Child : Parent() {

override fun onCreate() {

childProperty = Child()

}

}

```

在这个例子中,`childProperty`在`Parent`类中声明为`lateinit`,这样即使`Child`类在创建时调用了`onCreate`方法,`childProperty`也不会立即初始化,而是在第一次使用时才进行初始化。

另一方面,`lazy`关键字用于延迟初始化一个变量,但只会初始化一次。`lazy`变量必须被初始化在顶层或对象表达式内,并且只能被读取,不能被修改。使用`lazy`的变量在第一次被读取时会进行初始化,并且之后的读取都会返回相同的值。

例如,假设你有一个单例类`Singleton`,你可以这样使用`lazy`:

```kotlin

object Singleton {

val instance: Singleton by lazy { Singleton() }

}

fun main() {

val singleton = Singleton.instance

}

```

在这个例子中,`instance`变量被声明为`lazy`,这样它只会在第一次被读取时初始化,之后的读取都会返回同一个`Singleton`实例。

总的来说,`lateinit`和`lazy`都是处理初始化延迟的实用工具,但它们的使用场景和语义有所不同。`lateinit`适用于需要在运行时延迟初始化的变量,而`lazy`适用于只需要初始化一次的变量。