> Как избежать ошибок при использовании lateinit var в Kotlin (Kotlin, Android)

Уровень: senior · Роль: mobile · Категория: Технические вопросы

Компании: Ozon

Стек: Kotlin, Android

> Пример ответа

Чтобы избежать ошибок с lateinit var, следуйте этим правилам:

  1. Проверяйте инициализацию через ::isInitialized
    Перед доступом к свойству используйте if (::myVar.isInitialized) { ... }. Это предотвращает UninitializedPropertyAccessException.

  2. Инициализируйте как можно раньше
    В Android-контексте - в onCreate() для Activity или onViewCreated() для Fragment. Не откладывайте до onResume() или других поздних колбэков.

  3. Избегайте lateinit для nullable-типов
    lateinit предназначен только для ненулевых типов. Если значение может быть null, используйте var myVar: Type? = null с проверкой на null.

  4. Не используйте lateinit с примитивами
    Для Int, Boolean и т.д. используйте делегат by Delegates.notNull() или инициализируйте сразу.

  5. Осторожно с многопоточностью
    lateinit не потокобезопасен. Если свойство инициализируется в одном потоке, а читается в другом, синхронизируйте доступ или используйте lazy с LazyThreadSafetyMode.PUBLICATION.

  6. Предпочитайте lazy для однократной инициализации
    Если свойство инициализируется только один раз и не зависит от внешнего контекста (например, onCreate), используйте val myVar by lazy { ... } - это гарантирует инициализацию при первом доступе.

Пример правильного использования:

lateinit var adapter: MyAdapter

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    adapter = MyAdapter() // инициализация в onCreate
}

fun useAdapter() {
    if (::adapter.isInitialized) {
        adapter.notifyDataSetChanged()
    }
}

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью