В чем разница между final и const в Dart?

Ответ

Ключевые слова 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 — «святое и неизменное с пелёнок». Выбирай с умом, а не как попало.