Внедрение зависимостей в поля (field injection) с помощью Dagger имеет следующие особенности:
Необходимо @Inject для каждого поля: Каждое поле, в которое нужно внедрить зависимость, должно быть помечено аннотацией @Inject.
java
Требуется инъекция объекта-владельца: Класс, в котором находятся поля для инъекции (например, Activity, Fragment), не создается Dagger'ом напрямую. Его необходимо "инжектировать" из компонента. Для этого в компоненте добавляется метод inject() который принимает экземпляр этого класса.
java
Инъекция происходит после конструирования: Инъекция в поля происходит после того, как объект уже создан. Это означает, что в конструкторе этого объекта поля, помеченные @Inject, еще не будут инициализированы.
Ограниченная тестопригодность: Тестировать классы с инъекцией в поля может быть сложнее, так как для создания экземпляра класса и последующего использования приходится запускать процесс инъекции (через компонент), а не просто передавать моки через конструктор.
Potential for null fields in constructor: Если в конструкторе класса попытаться использовать поля, помеченные @Inject, они будут null, что может привести к NullPointerException.
Использование в Activity/Fragment: Инъекция в поля часто используется в компонентах Android (Activity, Fragment, Service), так как их жизненный цикл управляется фреймворком, и обычное конструкторное внедрение может быть неудобным.
Меньшая явность: В отличие от конструкторного внедрения, где все зависимости четко видны в сигнатуре конструктора, при инъекции в поля зависимости менее очевидны при первом взгляде на класс.
В целом, инъекция в поля удобна для Android-компонентов, но имеет недостатки с точки зрения явности и тестопригодности по сравнению с конструкторным внедрением.