Выбор ответа Middle Делегаты обновлено

Delegates.notNull или lateinit

Вопрос

Чем var port: Int by Delegates.notNull() отличается от lateinit var?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: notNull работает с примитивами, но без isInitialized. lateinit нельзя использовать с примитивами (Int, Boolean), а Delegates.notNull() можно: он хранит значение в объекте-делегате.

Варианты ответа

  1. Ничем, это одна реализация с разным синтаксисом
  2. notNull работает с примитивами, но без isInitializedправильный ответ
  3. notNull разрешает хранить null до первого чтения
  4. lateinit работает только с примитивами, а notNull с любыми

Разбор

lateinit нельзя использовать с примитивами (Int, Boolean), а Delegates.notNull() можно: он хранит значение в объекте-делегате. Зато проверки ::port.isInitialized у него нет, а обращение до присваивания бросит IllegalStateException. null не допускают оба. lateinit наоборот только для non-null ссылочных типов.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.