Sobes.tech
Назад к вопросам
Junior — Middle
105

Каким образом реализуется хранение объектов с неизменяемыми свойствами?

Компании, где спрашивали
Pashapay

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Нужно объяснить, как в Flutter/Dart делают объекты, которые после создания нельзя изменить. Обычно речь про final/const, final поля в классе и иммутабельные модели. Важно показать, что при изменении создаётся новый объект, а не меняется старый.

Определение:

Хранение объектов с неизменяемыми свойствами реализуется через иммутабельные классы: поля объявляются как final, а все значения передаются в конструктор и задаются один раз. Если объект нужно “изменить”, создаётся новый экземпляр с нужными данными. Для часто повторяющихся значений можно использовать const, чтобы Flutter/Dart мог переиспользовать объект.

Пример использования:

class User {
  final String name;
  final int age;

  const User({
    required this.name,
    required this.age,
  });

  User copyWith({
    String? name,
    int? age,
  }) {
    return User(
      name: name ?? this.name,
      age: age ?? this.age,
    );
  }
}

void main() {
  const user1 = User(name: 'Alice', age: 25);
  final user2 = user1.copyWith(age: 26);

  print(user1.age); // 25
  print(user2.age); // 26
}

Пояснение кода:

В примере класс User имеет два поля, оба помечены как final, поэтому присвоить им новое значение после создания объекта нельзя. Конструктор const позволяет создавать неизменяемые объекты и, при возможности, делать их константными. Метод copyWith не меняет исходный объект, а возвращает новый с обновлёнными значениями.

Пошагово:

  1. Создаётся объект user1 с фиксированными name и age.
  2. Метод copyWith получает новое значение age.
  3. Если новое значение не передали, берётся старое через this.name или this.age.
  4. Возвращается новый экземпляр User.
  5. Исходный user1 остаётся без изменений.

Ключевые моменты:

  • Неизменяемость в Dart обычно строится на final-полях и отсутствии сеттеров.
  • Изменение состояния заменяется созданием нового объекта.
  • Для удобного обновления моделей часто используют copyWith.
  • const подходит для объектов с полностью известными на этапе компиляции значениями.
  • Иммутабельные объекты проще тестировать, безопаснее передавать между слоями и использовать в состояниях UI.