Avatar ·

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 = ...` 才能使用它。