> Что такое оператор ??= в Dart (Flutter)

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

Компании: Верме

Стек: Flutter

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

Короткий ответ

Оператор ??= в Dart - это null-aware assignment operator, который присваивает значение переменной только в том случае, если она в данный момент равна null. Если переменная уже содержит значение, оператор ничего не делает. Это сокращение для проверки if (variable == null) { variable = value; }. Оператор работает с любыми типами, включая nullable-типы, и часто используется для ленивой инициализации или установки значений по умолчанию.

Подробное объяснение

Оператор ??= относится к группе null-aware операторов в Dart, которые помогают безопасно работать с nullable-значениями. Его синтаксис:

variable ??= value;

Это эквивалентно:

if (variable == null) {
  variable = value;
}

Ключевые особенности:

  • Оператор применяется только к переменным, которые могут быть null (nullable-типы).
  • Если переменная не null, оператор не выполняет присваивание и не вычисляет правую часть (ленивое вычисление).
  • Оператор возвращает значение переменной после операции (для использования в выражениях, хотя обычно используется как statement).
  • Работает с любыми типами данных: числами, строками, коллекциями, объектами.

Пример с коллекцией:

List<int>? numbers;
numbers ??= [1, 2, 3]; // numbers становится [1, 2, 3]
numbers ??= [4, 5];    // numbers остаётся [1, 2, 3], так как уже не null

Важно отличать от оператора ?? (null-coalescing), который возвращает правую часть, если левая равна null, но не присваивает результат переменной.

На практике

В реальном Flutter-коде оператор ??= часто используется для:

  • Ленивой инициализации полей класса.
  • Установки значений по умолчанию для nullable-параметров.
  • Инициализации кэшей или мемоизированных значений.
  • Работы с state management, когда нужно гарантировать наличие объекта.

Пример из практики:

class UserRepository {
  User? _cachedUser;
  
  User getUser() {
    _cachedUser ??= fetchFromApi();
    return _cachedUser!;
  }
}

Здесь ??= гарантирует, что запрос к API выполнится только один раз, а последующие вызовы вернут закэшированный результат.

Пример кода

void main() {
  // Базовый пример
  String? name;
  name ??= 'Аноним';
  print(name); // Аноним
  
  name ??= 'Другой';
  print(name); // Аноним (не изменилось)
  
  // С коллекциями
  Map<String, int>? scores;
  scores ??= {'Alice': 10};
  scores ??= {'Bob': 20};
  print(scores); // {Alice: 10}
  
  // В классе
  final config = AppConfig();
  config.retryCount ??= 3;
  print(config.retryCount); // 3
}

class AppConfig {
  int? retryCount;
}

Как отвечать на собеседовании

Начните с краткого определения: "Оператор ??= присваивает значение переменной только если она равна null". Затем приведите простой пример и объясните разницу с ??. Упомяните ленивое вычисление (правая часть не выполняется, если переменная не null). Покажите практическое применение - ленивая инициализация, значения по умолчанию. Если спросят про edge cases, отметьте, что оператор работает только с переменными, а не с final-полями, и что он возвращает значение (хотя обычно используется как statement).

Что проверяет интервьюер

Интервьюер оценивает:

  • Понимание nullable-типов в Dart и проблем, связанных с null.
  • Знание синтаксического сахара и умение его применять.
  • Способность объяснить разницу между ??, ??= и ?..
  • Понимание ленивого вычисления и его последствий.
  • Умение применять оператор в реальных сценариях Flutter-разработки.

Типичные ошибки

  • Путаница с ??: ?? возвращает значение, но не присваивает, ??= присваивает.
  • Попытка использовать ??= с final-переменными - это вызовет ошибку компиляции.
  • Забывают, что правая часть не вычисляется, если переменная уже не null - это может быть важно для производительности.
  • Использование ??= с non-nullable переменными - компилятор выдаст предупреждение или ошибку.
  • Неправильное понимание возвращаемого значения: оператор возвращает новое значение переменной, но в большинстве случаев это игнорируется.

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

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