Ответ
Ключевые слова final и const используются для объявления неизменяемых переменных, но их семантика и область применения различаются.
final (финальная переменная)
- Значение присваивается один раз в момент выполнения (runtime).
- Инициализацию можно отложить, например, выполнить в конструкторе.
- Объект, на который ссылается
finalпеременная, может быть изменяемым (mutable).
const (константа времени компиляции)
- Значение должно быть известно на этапе компиляции.
- Это не просто константа, а канонизированный объект. Создавая одинаковые
const-объекты, вы получаете ссылку на один и тот же экземпляр в памяти. - Сам объект и все его поля (если это коллекция или объект) должны быть неизменяемыми (immutable).
Сравнение на примерах:
// FINAL: Значение вычисляется в runtime.
final currentTime = DateTime.now(); // OK
final List<int> myList = [1, 2, 3];
myList.add(4); // OK! Список изменяем, хотя ссылка `myList` - нет.
// CONST: Значение должно быть известно при компиляции.
const maxItems = 100; // OK, литерал.
// const currentTimeConst = DateTime.now(); // ОШИБКА: runtime-значение.
const List<int> constList = [1, 2, 3];
// constList.add(4); // ОШИБКА времени компиляции: список неизменяем.
// Канонизация:
const a = const Point(1, 1); // Ключевое слово 'const' можно опустить: const a = Point(1, 1);
const b = Point(1, 1);
print(identical(a, b)); // true. Это один и тот же объект в памяти.
Использование в Flutter: const активно применяется для создания виджетов, так как это даёт оптимизацию производительности — фреймворк не перестраивает const-виджеты, а повторно использует их.
@override
Widget build(BuildContext context) {
return const Text( // Хорошая практика для статического текста
'Hello, World!',
style: TextStyle(fontSize: 16),
);
} Ответ 18+ 🔞
Давай разберёмся, в чём тут разница между final и const, а то народ постоянно путается, как будто это одно и то же. А это, ёпта, две большие разницы, как говорят в Одессе.
final — это как татуировка на жопе.
Сделал — и всё, переделать уже не получится, только с кожей сдирать. Значение присваивается один раз, но в момент работы программы (runtime). Можно инициализировать позже, хоть в конструкторе. Главное — ссылка зафиксирована. Но сам объект по этой ссылке может быть ещё тем хитрожопым изменяемым ублюдком.
const — это уже выжженная калёным железом константа.
Её значение должно быть известно ещё до того, как программа запустится, прямо на этапе компиляции. Это не просто неизменяемая переменная — это канонизированный объект. Если создаёшь два одинаковых const — получаешь ссылку на один и тот же кусок памяти, экономия на спичках. И да, сам объект и всё его нутро должны быть святыми и неизменными.
Сравниваем на живых примерах, чтобы волнение ебать пропало:
// FINAL: Работает в рантайме. Как часы.
final currentTime = DateTime.now(); // Всё ок, время узнали при запуске.
final List<int> myList = [1, 2, 3];
myList.add(4); // Опа-на! Работает! Список-то мутабельный, хоть ссылка и final.
// CONST: Всё должно быть ясно при компиляции. Никаких сюрпризов.
const maxItems = 100; // Ок, цифра как цифра.
// const currentTimeConst = DateTime.now(); // ОШИБКА! Компилятор охуел: "Чё? Я откуда знаю, который час?"
const List<int> constList = [1, 2, 3];
// constList.add(4); // ОШИБКА компиляции. Ты чё, совсем? Это же священный неизменяемый список!
// Канонизация — вот где магия, ядрёна вошь!
const a = const Point(1, 1); // Можно и так: const a = Point(1, 1);
const b = Point(1, 1);
print(identical(a, b)); // true. Это один и тот же объект, а не два разных. Оптимизация, мать её.
Зачем это в Flutter?
А вот зачем: const для виджетов — это как супер-оптимизация. Фреймворк видит const, понимает, что виджет никогда не изменится, и даже не пытается его перестраивать вхолостую. Просто берёт готовенький из кэша. Красота!
@override
Widget build(BuildContext context) {
return const Text( // Идеально для статического текста, который не дёргается.
'Hello, World!',
style: TextStyle(fontSize: 16),
);
}
Короче, запомни: final — «сделано и точка», const — «святое и неизменное с пелёнок». Выбирай с умом, а не как попало.