Ответ вслух Junior Dart: типы и null-safety обновлено

Как устроена null-safety в Dart

Вопрос

Расскажите, как устроена null-safety в Dart и как вы с ней работаете в проекте.

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

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

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

Коротко

Образцовый ответ: «В Dart типы по умолчанию ненулевые: в String не может оказаться null, а String? разрешает. Null-safety звуковая: компилятор гарантирует это для всей программы, и он же может выкинуть лишние проверки.

Что должно прозвучать в ответе

  • Типы по умолчанию ненулевые, `T?` явно разрешает `null`

  • Компилятор не даёт обратиться к `T?` без проверки, сужает тип после `if`

  • Сужение работает для локальных переменных и приватных final-полей, публичные поля копируют в локальную

  • Операторы `?.`, `??`, `??=`, `!` и чем опасен `!`

  • `late` для отложенной и ленивой инициализации с проверкой в рантайме

  • Null-safety звуковая (sound): если тип ненулевой, `null` там не окажется

Что могут спросить следом

  • Почему компилятор не сужает тип поля класса?
  • Когда оправдан оператор !?
  • Чем late final с инициализатором отличается от обычного final?

Разбор

Образцовый ответ: «В Dart типы по умолчанию ненулевые: в String не может оказаться null, а String? разрешает. Null-safety звуковая: компилятор гарантирует это для всей программы, и он же может выкинуть лишние проверки. Чтобы работать со значением T?, нужна проверка: после if (x != null) тип сужается до T. Важная деталь: сужение работает для локальных переменных и приватных final-полей, а публичное поле может быть геттером, поэтому я копирую его в локальную переменную. Для удобства есть ?., ?? и ??=. Оператор ! говорит компилятору «поверь мне», и при ошибке получаем исключение в рантайме, поэтому я его избегаю и стараюсь понять, откуда может прийти null. late использую для полей, которые задаются позже конструктора, например контроллеров в initState, и для ленивых вычислений»

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

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