← Назад к вопросам

В чем разница между 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 для гибкости.

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