Inicialização de propriedades em Kotlin: `by lazy` vs `lateinit` — quando usar cada um?
Olá a todos! Estou migrando de Java para Kotlin e me deparei com a dificuldade de entender a diferença entre `by lazy` e `lateinit` para inicialização tardia de propriedades. Parece que ambos resolvem o mesmo problema — não inicializar a propriedade imediatamente ao criar o objeto, mas sim mais tarde, quando ela for realmente necessária.
Mas eu fico constantemente confuso sobre qual opção escolher. Por exemplo, estou escrevendo um simples Android ViewModel. Preciso obter uma referência ao repositório, que é inicializado via DI (Dagger/Hilt), mas não quero torná-la nullable:
```kotlin
// Opção com lateinit
class MyViewModel : ViewModel() {
lateinit var repository: MyRepository
fun loadData() {
// Aqui tenho certeza de que repository já foi inicializado
repository.fetchData()
}
}
```
```kotlin
// Opção com lazy
class MyViewModel : ViewModel() {
val repository: MyRepository by lazy {
MyRepository() // Ou alguma factory
}
}
```
No primeiro caso, eu preciso chamar `repository = ...` em algum lugar antes de u