Ответ вслух Middle Делегаты спрашивают часто обновлено

Как работает by lazy

Вопрос

Расскажи, как работает by lazy, какие у него режимы и где его стоит и не стоит использовать.

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

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

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

Коротко

by lazy откладывает вычисление значения до первого обращения и затем возвращает сохранённый результат. Работает только для val, потому что Lazy умеет лишь отдавать значение.

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

  • Значение вычисляется при первом обращении и кешируется

  • Только для `val`

  • SYNCHRONIZED по умолчанию, PUBLICATION, NONE

  • При исключении значение не запоминается

  • Нельзя для объектов, зависящих от жизненного цикла view

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

  • Чем lazy отличается от lateinit?
  • Когда выбрать NONE?
  • Как устроен lazy внутри?

Разбор

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

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

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