Внедрение зависимостей кинжала Android не удается на частных полях
Я новичок в кинжале (хотя у меня есть опыт работы с DI, когда я работал над Java EE WebApps с использованием Weld).
Я пытаюсь внедрить зависимость в класс. Поле является частным.
Затем Dagger генерирует исключение, заявляя, что его нельзя внедрить в приватное поле.
В чем причина?
Ведь можно писать в приватные поля используя отражения даже на андроиде..
Если я устанавливаю видимость поля на что-то отличное от частного, инъекция, кажется, работает.
4 ответа
Создание частного поля 'package visible' не всегда может быть тем, что вы хотите. Документация Dagger предлагает следующее:
Внедрение финальных полей и частных членов. Для лучшей производительности Dagger генерирует код. Обойти это можно с помощью конструктора инъекций.
Вот пример:
private ItemFactoryImpl itemFactory;
private BuildingFactory buildingFactory;
@Inject
public World(ItemFactoryImpl itemFactory, BuildingFactory buildingFactory) {
this.itemFactory = itemFactory;
this.buildingFactory = buildingFactory;
}
Dagger не может поддерживать приватные поля и все еще поддерживает сгенерированные кодом адаптеры (чтобы избежать отражения). Такие системы, как Guice, поддерживают частные поля в том, что они отражают доступ к полю отраженным образом, прежде чем получить к ним доступ. Поскольку dagger генерирует InjectAdapter в том же пакете, что и класс для внедрения, он может получить доступ к пакетным, защищенным или открытым полям. Он не может получить доступ к приватным полям.
Одним из преимуществ Dagger является то, что он избегает отражения, поэтому использование отражения для обхода видимости поля нежелательно.
Просто удалить private
установить видимость вашего поля для упаковки дружественных.
Кинжал не поддерживает инъекцию в приватные поля.
См. официальную документацию Hilt
Поля, введенные Hilt, не могут быть закрытыми. Попытка внедрить закрытое поле с помощью Hilt приводит к ошибке компиляции.
- вы можете сделать поле общедоступным или
- использовать инъекцию конструктора