Поля final и глубокая неизменяемость
Создавайте объекты, которые никогда не изменяются
«Поля final и глубокая неизменяемость» — бесплатный урок Dart Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Dart Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Dart Academy содержит 4 уроков всего.
Неизменяемость по замыслу
Неизменяемый объект никогда не меняется после создания. Благодаря этому данные остаются предсказуемыми и безопасными для совместного использования во всём приложении. 🔒
Знакомство с final
Поле final задаётся один раз во время создания объекта и больше не может быть переназначено. Значение фиксируется на весь срок существования объекта.
class Point {
final int x;
Point(this.x);
}Переназначение вызывает ошибку
Попробуйте присвоить новое значение полю final — компилятор остановит Вас. Ошибка обнаруживается ещё до запуска программы.
final p = Point(3);
p.x = 9; // compile errorfinal и const
Используйте const, если значение известно во время компиляции, а final — если оно вычисляется во время выполнения. Оба ключевых слова запрещают последующее переназначение.
const pi = 3.14;
final now = DateTime.now();Конструкторы const
Добавьте классу конструктор const, и Dart сможет создавать действительно фиксированные экземпляры. Все его поля также должны быть final.
class Color {
final int rgb;
const Color(this.rgb);
}Общие экземпляры const
Два одинаковых объекта const в памяти являются одним и тем же экземпляром. Dart повторно использует их, экономя место и время.
const a = Color(0);
const b = Color(0);
print(identical(a, b)); // trueПоверхностная и глубокая неизменяемость
Поле final запрещает переназначение, но не замораживает объект, на который оно ссылается. В List, объявленный как final, всё ещё можно добавлять элементы.
final nums = [1, 2];
nums.add(3); // allowed!Цель глубокой неизменяемости
Глубокая неизменяемость означает, что ничто доступное через объект также не может измениться. Для этого недостаточно одного final.
Заморозка коллекций
Оберните список в List.unmodifiable, чтобы любая попытка добавить или удалить элемент вызывала ошибку. Теперь вся структура остаётся неизменяемой.
final tags = List.unmodifiable([1, 2]);
tags.add(3); // throws at runtimeЛитералы коллекций const
Добавьте const перед литералом, чтобы получить глубоко неизменяемую коллекцию, создаваемую во время компиляции. Изменить её вообще нельзя.
const days = ['Mon', 'Tue'];
// days.add(...) is forbiddenПочему это важно
Неизменяемые данные безопасны при работе из нескольких потоков, удобны для кэширования и хорошо подходят для управления состоянием во Flutter. Ошибки из-за незаметной мутации просто исчезают.
Быстрая проверка
Последняя проверка по темам final и неизменяемости.
Итоги
Вы узнали, что final фиксирует поле, const фиксирует значения времени компиляции, а для глубокой неизменяемости нужны неизменяемые или const-коллекции. 🎉
Часто задаваемые вопросы
Урок «Поля final и глубокая неизменяемость» бесплатный?
Да — полный текст урока «Поля final и глубокая неизменяемость» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Dart Academy, подпишись на CoddyKit PRO. Курс Dart Academy содержит 4 уроков всего.
Чему я научусь в уроке «Поля final и глубокая неизменяемость»?
Создавайте объекты, которые никогда не изменяются Ты практикуешь Dart Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Dart Academy?
Предыдущий опыт не требуется. Dart Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Поля final и глубокая неизменяемость»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Dart Academy?
Да. Каждый урок Dart Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Поля final и глубокая неизменяемость
- Классы sealed и исчерпывающий switch
- Модификаторы base, interface и final
- copyWith и равенство по значению