Как устроена null-safety в Dart
Вопрос
Расскажите, как устроена null-safety в Dart и как вы с ней работаете в проекте.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Типы по умолчанию ненулевые, `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 ошибок.