В чем разница между Dagger Lazy и Dagger Provider

«В чем разница между Dagger Lazy и Dagger Provider» — вопрос из категории DI, который задают на 24% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Lazy<T> и Provider<T> в Dagger используются для отложенного получения зависимостей, но с разной семантикой:

  1. Provider
    • Каждый вызов get() создаёт новый инстанс (если зависимость не @Singleton)
    • Подходит для случаев, когда нужны множественные экземпляры
@Inject lateinit var provider: Provider<HeavyService>
// Каждый вызов создаёт новый объект:
val service1 = provider.get() 
val service2 = provider.get() // service1 != service2
  1. Lazy
    • Ленивая инициализация: объект создаётся только при первом вызове get()
    • Последующие вызовы возвращают тот же инстанс (даже для non-Singleton)
    • Потокобезопасен
@Inject lateinit var lazyService: Lazy<HeavyService>
// Объект создаётся только здесь:
val service = lazyService.get() 
// Возвращает тот же инстанс:
val sameService = lazyService.get() 

Ключевое отличие: Provider всегда создаёт новый объект, Lazy кэширует результат после первого вызова.