Какие способы внедрения зависимостей существуют кроме конструктора
Что проверяют
Понимаете ли вы, почему конструктор считается основным способом и в каких местах Android он недоступен. Следом обычно спрашивают, как Hilt внедряет зависимости в Activity и Fragment и чем Koin отличается от Dagger по принципу работы.
Как отвечать
Начните с того, что конструктор предпочтителен: зависимости видны в сигнатуре, объект не бывает недособранным. Остальные способы нужны там, где конструктором вы не управляете:
- через поле:
@Inject lateinit varвActivity,Fragment,Service. Их создаёт система, поэтому Hilt заполняет поля сам: уActivityвнутриsuper.onCreate(), уFragmentвonAttach(); - через метод: метод с
@InjectDagger вызывает сразу после конструктора и полей. Подходит, когда нужно передать ссылку на сам объект или выполнить настройку после сборки; - через параметр вызова: зависимость передаётся конкретному методу, если нужна только ему;
- assisted injection:
@AssistedInjectи@AssistedFactory, когда часть аргументов известна только в рантайме (id записи), а остальное даёт граф; Provider<T>иLazy<T>: новый экземпляр на каждый запрос или отложенное создание тяжёлого объекта;- сервис-локатор: объект сам достаёт зависимости из реестра. Так устроен
by inject()в Koin, так же выглядит ручнойAppContainerвApplication; CompositionLocalв Compose: неявная передача значения вниз по дереву. Годится для темы или локали, но не для бизнес-сервисов.
Для ViewModel отдельный ответ: @HiltViewModel плюс внедрение в конструктор, а в экран она попадает через hiltViewModel() или by viewModels().
Где спотыкаются
Используют внедрение в поле в собственных классах, где ничто не мешает конструктору. Зависимости прячутся, а для теста приходится поднимать граф.
Обращаются к lateinit-полю до super.onCreate() и получают UninitializedPropertyAccessException, потому что не знают, в какой момент Hilt его заполняет.
Называют Koin «таким же DI, как Dagger». Koin по умолчанию разрешает зависимости в рантайме и работает как локатор, а Dagger и Hilt строят граф при компиляции, и отсутствующая зависимость ловится на сборке.