На самом деле меня никогда не спрашивали о таком, но я много читала, что на собеседованиях вопросы часто встречаются. Попробуем поразмышлять.
Зачем нужен Dagger и используешь ли ты его?
Да, я его использую. В любом проекте существует достаточно много объектов, которые мы создаем в разных местах и за которыми надо следить (сколько он должен жить, как создавать и т.п.). А еще, если следовать принципу инверсии управления (ни один класс не должен создавать экземпляр другого класса, а должен получать экземпляры из класса конфигурации), то нам бы еще пришлось создавать фабрики и постоянно поддерживать их. Если на маленьких проектах еще можно вручную разбираться с этим, то в больших нереально. И тут нас спасают подобные фреймворки как Dagger.
Использование даггера помогает сократить написанный нами код. Мы говорим даггеру как создать объект, область его действия и прочее. Даггер всё создает и сам следит, а мы просто получаем в нужных местах. Очень удобно, когда что-то делает нашу работу. :)
Как даггер работает? Всё происходит на основе аннотаций, которые как раз и помогают генерировать код для нас. Мы указываем какие-то основные слова, а даггер уже генерирует нам код во время компиляции.
По сути, компилятор просто читает файлы в поисках аннотаций и потом вызывает соответствующий процессор, который всё разруливает.
Самые основные аннотации: @Module, @Provides, @Component и @Inject.
Разберем каждую:
@Module — именно тут указываются методы, которые помогают объявлять объекты. Такие методы должны быть с аннотацией @Provides или @Binds.
@Inject — используем в тех классах, где как раз нужны какие-то объекты.
@Component — по сути, это мост между модулем и потребителем — граф зависимостей. Он соединяет методы из класса с аннотацией @Module с местами, где мы используем @Inject. Именно тут создается контейнер со всеми зависимостями, которые нужны.
Еще мы можем использовать скоуп-аннотации, чтобы ограничить жизнь объекта жизнью его компонента. Можем использовать, например, Singleton или создать свою кастомную аннотацию. Тогда каждый раз, пока жив компонент, будем использовать один объект.
Дубль статей в телеграмме — https://t.me/android_junior
Мой твиттер в телеграмме — https://t.me/android_junior_notes