Когда стоит использовать Inject constructor в Dagger

Ответ

Использование @Inject constructor в Dagger уместно, когда:

  1. Класс находится под твоим контролем (не из сторонней библиотеки).
  2. Нужен простой способ внедрения зависимостей без лишних модулей.
  3. Зависимость может быть создана через конструктор (нет сложной логики инициализации).

Пример:

class UserRepository @Inject constructor(
    private val apiService: ApiService,
    private val cache: UserCache
) { ... }

Когда НЕ использовать:

  • Для классов из сторонних библиотек (лучше @Module + @Provides).
  • Если нужен кастомный способ создания объекта (например, с параметрами).
  • Для интерфейсов (требует привязки через @Binds).

Ответ 18+ 🔞

А, ну это ж классика, ёпта! Сейчас разжую, как кот сука собака бутерброд. Смотри, @Inject constructor — это как волшебный пендель от Dagger'а, чтобы он сам всё собрал.

Вот когда его впендюрить самое то:

  1. Класс — твой собственный, а не из чужой библиотеки. Ну то есть ты его сам написал, а не скачал какую-нибудь мартышлюшку откуда-то. Dagger в чужие конструкторы не лезет, ему доверия ебать ноль.
  2. Хочешь, чтобы всё было просто, без лишних танцев с бубном. Неохота городить отдельный модуль, где ты вручную будешь объяснять, как этот объект печь. Сказал @Inject на конструкторе — и Dagger сам, как хитрая жопа, сообразит, что куда.
  3. Всё, что нужно классу, можно запихнуть через конструктор. Нет там никакого скрытого говна, которое нужно инициализировать каким-то хитрым способом. Просто дай ему зависимости в параметры — и он счастлив.

Вот смотри, как это выглядит, прям как в жизни:

class UserRepository @Inject constructor(
    private val apiService: ApiService, // Дай мне это
    private val cache: UserCache        // И это
) { ... }

Dagger увидит эту аннотацию, посмотрит, что у него уже есть ApiService и UserCache, и просто, бля, скормит их репозиторию. Красота!

А вот когда НЕ надо, а то будет вам хиросима и нигерсраки:

  • Для классов из чужих библиотек. Ты ж не можешь в их конструктор свою аннотацию воткнуть, они же не твои. Тут придётся делать модуль с @Provides и объяснять Dagger'у вручную, как эту штуку готовить.
  • Если объект надо собрать нестандартно. Например, ему для создания нужно передать какой-то параметр (скажем, userId), который известен только в рантайме. Через конструктор так не запилишь, тут уже кастомная фабрика нужна.
  • Для интерфейсов. Ну ясен пень, интерфейс — он абстрактный, у него конструктора-то нет! Для этого есть @Binds, чтобы привязать реализацию к интерфейсу.

Короче, правило простое: если класс твой, и он простой, как три копейки — смело лепи @Inject constructor и живи спокойно. Если что-то сложнее — готовь модули, фабрики и прочую магию. Dagger, он хоть и умный, но не телепат, ёпта.