Что такое immutable (неизменяемые) объекты в Dart?

«Что такое immutable (неизменяемые) объекты в Dart?» — вопрос из категории Dart Core, который задают на 29% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Immutable (неизменяемые) объекты в Dart — это объекты, состояние которых нельзя изменить после их создания. Любая операция, которая выглядит как изменение, на самом деле создает новый объект. Эта концепция является фундаментальной для Flutter, так как все виджеты (Widget) являются неизменяемыми.

Пример создания immutable-класса:

// Ключевые элементы: final поля и const конструктор
class AppConfig {
  final String appName;
  final String apiUrl;
  final int versionCode;

  // Константный конструктор позволяет кешировать экземпляры
  const AppConfig({
    required this.appName,
    required this.apiUrl,
    required this.versionCode,
  });
}

void main() {
  // Использование const создает один экземпляр в памяти
  const config = AppConfig(
    appName: 'MyFlutterApp',
    apiUrl: 'https://api.example.com',
    versionCode: 1,
  );

  // Любая "модификация" создает новый объект
  final updatedConfig = AppConfig(
    appName: config.appName,
    apiUrl: 'https://api.new.example.com', // Изменили URL
    versionCode: config.versionCode,
  );
}

Преимущества immutable объектов в контексте Flutter/Dart:

  • Предсказуемость состояния: Исключаются побочные эффекты, когда объект неожиданно меняется в разных частях приложения.
  • Безопасность для конкурентности: Изоляты (Isolates) в Dart не разделяют память, и неизменяемые данные можно безопасно передавать между ними.
  • Оптимизация производительности: Flutter может делать быстрые сравнения (Widget.canUpdate) на основе неизменяемости, чтобы понять, нужно ли перестраивать часть дерева. Ключевое слово const кеширует экземпляры, уменьшая нагрузку на сборщик мусора.
  • Упрощение отладки: Состояние объекта фиксировано в момент создания.

Встроенные типы, такие как String, int, double, также являются неизменяемыми.