Ответ вслух Senior DI: Hilt и Koin обновлено

Скоупы и время жизни зависимостей

Вопрос

Как ты выбираешь скоуп для зависимости в Hilt? Какие ошибки со скоупами встречал?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

По умолчанию оставляю класс без скоупа: Hilt создаст новый экземпляр при каждом внедрении, это дёшево и безопасно для объектов без состояния.

Что должно прозвучать в ответе

  • Без скоупа новый экземпляр при каждом внедрении

  • Скоуп для дорогих объектов и общего состояния

  • Singleton для OkHttp, Retrofit, базы данных

  • ViewModelScoped для состояния, общего внутри ViewModel

  • Ошибки: всё Singleton, Activity-контекст в синглтоне

  • Скоуп компонента не может зависеть от более короткоживущего

Что могут спросить следом

  • Что такое ActivityRetainedComponent?
  • Можно ли внедрить ActivityScoped объект в Singleton?

Разбор

По умолчанию оставляю класс без скоупа: Hilt создаст новый экземпляр при каждом внедрении, это дёшево и безопасно для объектов без состояния. Скоуп ставлю, когда объект дорогой или должен разделять состояние. @Singleton для OkHttpClient, Retrofit, базы Room, репозиториев с кешем в памяти. @ViewModelScoped, если несколько зависимостей одной ViewModel должны делить один объект. @ActivityRetainedScoped для того, что должно пережить поворот, но не дольше. Типичные ошибки: пометить всё @Singleton, и объекты с состоянием экрана начинают жить между экранами и держать память; внедрить контекст Activity в синглтон и получить утечку. Hilt защищает от части ошибок: долгоживущий компонент не может зависеть от биндинга с более коротким скоупом, это ошибка компиляции.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.