lateinit используется для non-nullable свойств, которые будут инициализированы позже, до первого доступа к ним. Применяется с var.
kotlin
by lazy используется для non-nullable или nullable свойств, которые инициализируются при первом доступе к ним. Применяется с val.
kotlin
Сравнение:
| Признак | lateinit | by lazy |
|---|---|---|
| Применение | var | val |
| Тип свойства | Non-nullable | Non-nullable или nullable |
| Инициализация | Позднее, вручную | При первом доступе, автоматически |
| Потокобезопасность | Не гарантируется по умолчанию (если не синхронизировано вручную) | Гарантируется по умолчанию (синхронизировано) |
| Нулевое значение | Не допускается до инициализации (бросит исключение) | Нет (тип определяется инициализатором) |
Используйте lateinit когда значение свойства зависит от контекста или других факторов и должно быть установлено после создания объекта, но до его использования (например, при привязке View в Android Activity).
Используйте by lazy для свойств, которые затратны в создании или могут не понадобиться в течение всего времени жизни объекта, или когда инициализацию нужно отложить до момента первого фактического использования.