Lateinit vs by lazy
В чём разница инициализации переменных с помощью lateinit и by lazy?
by lazy гарантирует тебе, что твоя переменная инициализируется только при первом запросе к ней, а при остальных запросах отдаст тот же инстанс.
Таким образом, ты будешь инициализировать каждую переменную, только когда она реально понадобится.
Иначе, когда при создании класса ты полезешь инициализировать сразу все 10 тяжёлых переменных в UI-потоке, у пользователя всё будет тормозить. А нам этого не хочется.
lateinit тебе ничего не гарантирует, lateinit - это просто "компилятор отвали, сам разберусь"
lateinit при попытке обращения к переменной, которую ты не инициализировал, свалится с экспешном.
А by lazy под капотом получит эксепшн и сам сходит в ту лямбду, которую ты ему передал для получения инстанса, и этот же инстанс потом и будет использовать при повторных обращениях.
Поэтому лейтиниты используются чаще всего для инжектов DI или для вьюбайндинга. Но во втором случае все равно может быть опасно, андроид – штука не всегда предсказуемая. Захочет кильнуть тебе процесс, или doze mode какой-нибудь настанет, что-то убьётся и криво попытается пересоздасться системой, жизненный цикл пойдёт по кривому пути и привет крэш =)
А вот by lazy использовать – это на здоровье. Только сильно тоже не увлекайтесь, а то читаемость кода может стать слишком плохой, и появиться неявные зависимости при инициализации разных переменных.
Может, знаете ещё минусы поздних и отложенных инициализаций?
Post #152
719
- 👍 8
- 🔥 5
- ❤ 2
- 😍 1
- 💯 1