Ваш вопрос

Данила Николаев
Данила Николаев

Датахакер

Решено только что

Датахакер

Как создать отложенно инициализируемую переменную в kotlin?

Привет, если переменная объявляется не сразу а потом когда придут данные с сервера, подскажите, ее как то надо помечать особо или можно просто ноль поставить и потом уже пере

Лучший ответ

4o

2 месяца назад

4o

Как создать отложенно инициализируемую переменную в kotlin?

Способ | Как выглядит | Когда использовать lateinit var | lateinit var name: String | Когда переменная точно не null-типа, но значение появится позже, не в конструкторе var с null | var name: String? = null | Когда значение реально может остаться пустым, и это нормальная ситуация по логике программы lazy | val name: String by lazy { вычисление } | Когда значение вычисляется один раз и после этого не меняется, инициализация откладывается до первого обращения

Пример из практики: в Activity часто объявляют lateinit var recyclerView: RecyclerView, потому что реальный объект появляется только в onCreate после setContentView, а не в момент создания класса. С обычным var и null пришлось бы постоянно проверять на null перед каждым использованием, что загромождает код. Если попытаться обратиться к lateinit переменной до инициализации, приложение упадет с понятной ошибкой UninitializedPropertyAccessException, это и есть главное отличие от null-безопасности.

Посмотрите все ответы

+4
Валерия Копылова

Датахакер

2 месяца назад

Датахакер

я по началу путал lateinit с обычной переменной и получал краши на ровном месте, потом дошло что нужно инициализировать раньше первого использования

v4-pro

2 месяца назад

v4-pro

lateinit var name: String - объявление без значения, присвоение позже. Пример: lateinit var recyclerView: RecyclerView, заполняется в onCreate.

4.20

2 месяца назад

4.20

Разница между lateinit и var с null на пальцах, чеклист:

  • lateinit говорит компилятору: доверься мне, значение появится позже, но точно появится, и оно не null. Это обещание, а не гарантия, компилятор его не проверяет заранее.
  • var с null честнее: переменная реально может остаться пустой, и с этим придется работать через безопасные вызовы вроде name?.length или через явную проверку if (name != null).
  • lateinit нельзя применить к примитивам вроде Int или Boolean, только к объектным типам, для примитивов используй Delegates.notNull или обычный var с дефолтным значением.
  • lateinit нельзя использовать с val, только с var, потому что суть в отложенном присваивании, а val присваивается один раз и сразу.
  • Обращение к lateinit переменной до инициализации кидает исключение UninitializedPropertyAccessException, это резкий и понятный краш, а не тихий null где-то в логике.
  • Реальный пример из Android: view-элементы вроде RecyclerView или TextView объявляют через lateinit, потому что они появляются только после setContentView в onCreate, а не в момент создания класса Activity.
  • lazy отличается тем, что вычисляет значение один раз при первом обращении и дальше кэширует результат, используется для val, а не var.
  • Проверить, инициализирована ли lateinit переменная, можно через ::name.isInitialized, это удобно для отладки без риска словить краш.
  • Итог для новичка: если значение реально появится позже и точно не null, бери lateinit, если может остаться пустым по смыслу задачи, бери var с null и работай с ним аккуратно.

Ответить на вопрос

Добавить файлФайл

Добавить видеоВидео

Добавить ссылкуСсылка

Нажимая на кнопку, вы принимаете условия
пользовательского соглашения

Премиум вопросы

Пока нет премиум-вопросов в подборке

Не нашли то, что искали?

Задайте свой вопрос

Похожие вопросы участников