lateinit используется для отложенной инициализации изменяемых свойств (var), которые не могут быть nullable и будут инициализированы позже, например, в методе жизненного цикла активности или фрагмента. Компилятор не гарантирует инициализацию, и доступ к неинициализированному свойству вызовет исключение UninitializedPropertyAccessException.
by lazy {} используется для отложенной инициализации неизменяемых свойств (val). Инициализация выполняется при первом доступе к свойству, и результат кешируется. Это потокобезопасно по умолчанию и гарантирует, что инициализатор будет вызван только один раз.
| Признак | lateinit | by lazy {} |
|---|---|---|
| Применяется к | var | val |
| Nullability | Не nullable | Не nullable |
| Гарантия инициализации | Нет (только разработчиком) | Да (при первом доступе) |
| Потокобезопасность | Не гарантируется по умолчанию | Да (по умолчанию) |
| Тип свойства | Изменяемый | Неизменяемый |
Пример с lateinit:
kotlin
Пример с by lazy {}:
kotlin