Назад к вопросам
Junior
202
questionbank
Чем отличаются ключевые слова final и const в Dart?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
final и const используются для создания переменных, значения которых нельзя изменить после инициализации.
Основные отличия:
-
Время инициализации:
finalинициализируется во время выполнения (runtime) при первом обращении.constинициализируется во время компиляции (compile-time).
-
Тип значений:
finalпеременная может хранить значение, которое вычисляется во время выполнения.constпеременная должна хранить значение, которое может быть вычислено во время компиляции (литералы, результат константных выражений).
-
Константность:
final: Переменная является константной, но значение, на которое она ссылается (если это объект), может быть изменяемым.const: Переменная является константной, и значение, на которое она ссылается, также должно быть константным (неизменяемым).
Примеры:
// final - инициализируется во время выполнения
final DateTime now = DateTime.now(); // Значение известно только в runtime
// const - инициализируется во время компиляции
const double pi = 3.14; // Значение известно на этапе компиляции
// Использование const для списков и карт делает их неизменяемыми
const List<int> constantList = [1, 2, 3];
// constantList[0] = 10; // Ошибка! Список неизменяемый
// Использование final для списков и карт делает переменную неизменяемой,
// но содержимое объекта может быть изменено (если объект изменяемый)
final List<int> finalList = [1, 2, 3];
finalList[0] = 10; // Разрешено, так как сам List изменяемый
// final с константным значением
final int a = 5; // Можно, но const более уместен
| Инициализация | Требования к значению | Мутабельность объекта (если ссылается на объект) | |
|---|---|---|---|
final |
Во время выполнения | Может вычисляться во время выполнения | Может быть изменяемым, если объект по своей сути изменяемый |
const |
Во время компиляции | Должно быть известно во время компиляции | Должно быть неизменяемым |