Initialisierung von Eigenschaften in Kotlin: `by lazy` vs `lateinit` – wann was verwenden?
Hallo zusammen! Ich wechsle von Java zu Kotlin und habe Schwierigkeiten, den Unterschied zwischen `by lazy` und `lateinit` für die verzögerte Initialisierung von Eigenschaften zu verstehen. Beide scheinen dasselbe Problem zu lösen – eine Eigenschaft nicht sofort bei der Objekterstellung zu initialisieren, sondern später, wenn sie tatsächlich benötigt wird.
Aber ich bin ständig verwirrt, welche Option ich wählen soll. Zum Beispiel schreibe ich ein einfaches Android ViewModel. Ich muss eine Referenz auf ein Repository erhalten, das über DI (Dagger/Hilt) initialisiert wird, aber ich möchte es nicht nullable machen:
```kotlin
// Variante mit lateinit
class MyViewModel : ViewModel() {
lateinit var repository: MyRepository
fun loadData() {
// Hier bin ich sicher, dass repository bereits initialisiert ist
repository.fetchData()
}
}
```
```kotlin
// Variante mit lazy
class MyViewModel : ViewModel() {
val repository: MyRepository by lazy {
MyRepository() // Oder eine Factory
}
}
```
Im ersten Fall muss ich irgendwo `repository = ...` aufrufen, bevor