Каким образом реализуется хранение объектов с неизменяемыми свойствами?
Ответ от нейросети
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 не меняет исходный объект, а возвращает новый с обновлёнными значениями.
Пошагово:
- Создаётся объект
user1с фиксированнымиnameиage. - Метод
copyWithполучает новое значениеage. - Если новое значение не передали, берётся старое через
this.nameилиthis.age. - Возвращается новый экземпляр
User. - Исходный
user1остаётся без изменений.
Ключевые моменты:
- Неизменяемость в Dart обычно строится на
final-полях и отсутствии сеттеров. - Изменение состояния заменяется созданием нового объекта.
- Для удобного обновления моделей часто используют
copyWith. constподходит для объектов с полностью известными на этапе компиляции значениями.- Иммутабельные объекты проще тестировать, безопаснее передавать между слоями и использовать в состояниях UI.