← Назад к вопросам
В чем разница между Dagger Lazy и Dagger Provider?
1.8 Middle🔥 141 комментариев
#Dependency Injection
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
В чем разница между Dagger Lazy и Dagger Provider?
Lazy и Provider — это специальные оборачивающие типы в Dagger 2 для отложенной инъекции зависимостей. Обе решают проблему ленивой инициализации, но работают по-разному.
Различия
| Аспект | Lazy<T> | Provider<T> |
|---|---|---|
| get() | Один раз | Каждый раз |
| Кэширование | Результат кэшируется | Нет кэширования |
| Скоп | Уважает scopes | Может проигнорировать |
| Использование | Дорогие объекты | Переиспользуемые объекты |
Lazy<T>: Инициализация один раз
@Inject
latinvar database: Lazy<Database>
fun query() {
val db: Database = database.get()
val result = db.query()
}
fun query2() {
val db: Database = database.get() // Тот же объект
}
Provider<T>: Инициализация каждый раз
@Inject
latinvar databaseProvider: Provider<Database>
fun query() {
val db1: Database = databaseProvider.get()
val result1 = db1.query()
}
fun query2() {
val db2: Database = databaseProvider.get() // Другой объект!
}
Когда использовать Lazy
Для дорогих объектов (Database, API Client), которые могут вообще не использоваться.
class UserViewModel(
private val userRepo: Lazy<UserRepository>
) : ViewModel() {
fun loadUser() {
val user = userRepo.get().getUser()
}
}
Когда использовать Provider
Для объектов, которые должны быть всегда новые, или фабрик для создания instances.
class AndroidDialogFactory(
private val context: Context,
private val themeProvider: Provider<Theme>
) {
override fun createDialog(): Dialog {
val theme = themeProvider.get() // Новая тема каждый раз
return Dialog(context, theme)
}
}
Scopes и Provider
Provider может игнорировать scopes (например @ActivityScope). Lazy уважает scopes и кэширует внутри scope.
Выводы
Lazy<T>:
- Инициализация один раз при первом вызове
- Результат кэшируется
- Уважает @Scope
- Для дорогих объектов
Provider<T>:
- Инициализация каждый раз
- Нет кэширования
- Игнорирует scopes
- Для фабрик и переиспользуемых объектов
Правило: используй Lazy для экономии ресурсов, Provider для гибкости.