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`适用于只需要初始化一次的变量。

