Скоупы и время жизни зависимостей
Вопрос
Как ты выбираешь скоуп для зависимости в Hilt? Какие ошибки со скоупами встречал?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Без скоупа новый экземпляр при каждом внедрении
Скоуп для дорогих объектов и общего состояния
Singleton для OkHttp, Retrofit, базы данных
ViewModelScoped для состояния, общего внутри ViewModel
Ошибки: всё Singleton, Activity-контекст в синглтоне
Скоуп компонента не может зависеть от более короткоживущего
Что могут спросить следом
- Что такое ActivityRetainedComponent?
- Можно ли внедрить ActivityScoped объект в Singleton?
Разбор
По умолчанию оставляю класс без скоупа: Hilt создаст новый экземпляр при каждом внедрении, это дёшево и безопасно для объектов без состояния. Скоуп ставлю, когда объект дорогой или должен разделять состояние. @Singleton для OkHttpClient, Retrofit, базы Room, репозиториев с кешем в памяти. @ViewModelScoped, если несколько зависимостей одной ViewModel должны делить один объект. @ActivityRetainedScoped для того, что должно пережить поворот, но не дольше. Типичные ошибки: пометить всё @Singleton, и объекты с состоянием экрана начинают жить между экранами и держать память; внедрить контекст Activity в синглтон и получить утечку. Hilt защищает от части ошибок: долгоживущий компонент не может зависеть от биндинга с более коротким скоупом, это ошибка компиляции.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.