Найти тему

Dagger. Вопросы на собеседовании.

На самом деле меня никогда не спрашивали о таком, но я много читала, что на собеседованиях вопросы часто встречаются. Попробуем поразмышлять.

Зачем нужен 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