Ответ
Использование @Inject constructor в Dagger уместно, когда:
- Класс находится под твоим контролем (не из сторонней библиотеки).
- Нужен простой способ внедрения зависимостей без лишних модулей.
- Зависимость может быть создана через конструктор (нет сложной логики инициализации).
Пример:
class UserRepository @Inject constructor(
private val apiService: ApiService,
private val cache: UserCache
) { ... }
Когда НЕ использовать:
- Для классов из сторонних библиотек (лучше
@Module+@Provides). - Если нужен кастомный способ создания объекта (например, с параметрами).
- Для интерфейсов (требует привязки через
@Binds).
Ответ 18+ 🔞
А, ну это ж классика, ёпта! Сейчас разжую, как кот сука собака бутерброд. Смотри, @Inject constructor — это как волшебный пендель от Dagger'а, чтобы он сам всё собрал.
Вот когда его впендюрить самое то:
- Класс — твой собственный, а не из чужой библиотеки. Ну то есть ты его сам написал, а не скачал какую-нибудь мартышлюшку откуда-то. Dagger в чужие конструкторы не лезет, ему доверия ебать ноль.
- ️ Хочешь, чтобы всё было просто, без лишних танцев с бубном. Неохота городить отдельный модуль, где ты вручную будешь объяснять, как этот объект печь. Сказал
@Injectна конструкторе — и Dagger сам, как хитрая жопа, сообразит, что куда. - Всё, что нужно классу, можно запихнуть через конструктор. Нет там никакого скрытого говна, которое нужно инициализировать каким-то хитрым способом. Просто дай ему зависимости в параметры — и он счастлив.
Вот смотри, как это выглядит, прям как в жизни:
class UserRepository @Inject constructor(
private val apiService: ApiService, // Дай мне это
private val cache: UserCache // И это
) { ... }
Dagger увидит эту аннотацию, посмотрит, что у него уже есть ApiService и UserCache, и просто, бля, скормит их репозиторию. Красота!
А вот когда НЕ надо, а то будет вам хиросима и нигерсраки:
- Для классов из чужих библиотек. Ты ж не можешь в их конструктор свою аннотацию воткнуть, они же не твои. Тут придётся делать модуль с
@Providesи объяснять Dagger'у вручную, как эту штуку готовить. - Если объект надо собрать нестандартно. Например, ему для создания нужно передать какой-то параметр (скажем,
userId), который известен только в рантайме. Через конструктор так не запилишь, тут уже кастомная фабрика нужна. - Для интерфейсов. Ну ясен пень, интерфейс — он абстрактный, у него конструктора-то нет! Для этого есть
@Binds, чтобы привязать реализацию к интерфейсу.
Короче, правило простое: если класс твой, и он простой, как три копейки — смело лепи @Inject constructor и живи спокойно. Если что-то сложнее — готовь модули, фабрики и прочую магию. Dagger, он хоть и умный, но не телепат, ёпта.