Kotlin 属性初始化:`by lazy` vs `lateinit` — 何时使用?
大家好!我正在从 Java 转向 Kotlin,遇到了对 `by lazy` 和 `lateinit` 用于延迟初始化属性的理解问题。似乎两者都解决同一个问题——不在创建对象时立即初始化属性,而是稍后在实际需要时再进行初始化。
但我总是搞不清该选哪个。例如,我正在编写一个简单的 Android ViewModel。我需要获取一个通过 DI(Dagger/Hilt)初始化的 repository 引用,但我不想让它成为 nullable:
```kotlin
// 使用 lateinit 的版本
class MyViewModel : ViewModel() {
lateinit var repository: MyRepository
fun loadData() {
// 这里我确信 repository 已经初始化
repository.fetchData()
}
}
```
```kotlin
// 使用 lazy 的版本
class MyViewModel : ViewModel() {
val repository: MyRepository by lazy {
MyRepository() // 或者某个工厂
}
}
```
在第一种情况下,我必须在某个地方调用 `repository = ...` 才能使用它。