Как работает by lazy
Вопрос
Расскажи, как работает by lazy, какие у него режимы и где его стоит и не стоит использовать.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Значение вычисляется при первом обращении и кешируется
Только для `val`
SYNCHRONIZED по умолчанию, PUBLICATION, NONE
При исключении значение не запоминается
Нельзя для объектов, зависящих от жизненного цикла view
Что могут спросить следом
- Чем
lazyотличается отlateinit? - Когда выбрать
NONE? - Как устроен
lazyвнутри?
Разбор
by lazy откладывает вычисление значения до первого обращения и затем возвращает сохранённый результат. Работает только для val, потому что Lazy умеет лишь отдавать значение. По умолчанию режим SYNCHRONIZED: при гонке потоков инициализатор выполнится ровно один раз, остальные подождут. PUBLICATION позволяет вычислить параллельно, но сохранит первый результат, а NONE вообще без синхронизации и подходит для кода, который живёт в одном потоке. Если инициализатор бросил исключение, значение не запоминается и следующее обращение попробует снова. Использую lazy для тяжёлых объектов, которые нужны не всегда, например форматтеров или парсеров. Не использую для того, что привязано к жизненному циклу view во фрагменте: значение переживёт view и будет держать старую иерархию.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.