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