Что такое const конструктор в Dart?

Ответ

Const конструктор в Dart создаёт объекты, которые являются неизменяемыми (immutable) и вычисляются на этапе компиляции. Это позволяет компилятору кэшировать и повторно использовать идентичные экземпляры, что экономит память и повышает производительность.

Ключевые условия для использования const конструктора:

  • Все поля класса должны быть объявлены как final.
  • Сам класс должен быть неизменяемым.

Пример:

class ImmutablePoint {
  final double x;
  final double y;

  const ImmutablePoint(this.x, this.y);
}

void main() {
  const point1 = ImmutablePoint(5.0, 10.0); // Создаётся в compile-time
  const point2 = ImmutablePoint(5.0, 10.0); // Используется кэшированный экземпляр

  print(identical(point1, point2)); // true — это один и тот же объект в памяти

  // Сравнение с обычным конструктором:
  final point3 = ImmutablePoint(5.0, 10.0);
  final point4 = ImmutablePoint(5.0, 10.0);
  print(identical(point3, point4)); // false — разные объекты
}

Практическое применение во Flutter: Const конструкторы активно используются в виджетах Flutter для оптимизации перестроений. Например, Text, SizedBox, Padding имеют const конструкторы, что позволяет Flutter избегать лишних ререндеров при создании неизменяемых виджетов.

Ответ 18+ 🔞

А, ну это про const конструкторы в Dart! Давайте разберём, что это за хитрая жопа такая, а то многие впадают в ступор, когда видят это слово.

Представьте, что вы печёте пирожки. Обычный конструктор — это когда вы каждый раз лепите новый пирожок, даже если начинка и тесто одинаковые. А const конструктор — это волшебная печь, которая, если вы уже испекли точно такой же пирожок, просто достаёт его из холодильника и говорит: «На, братан, не парься, уже есть готовый». Экономия времени и муки — красота!

Так вот, главные правила, чтобы твой класс мог такую магию творить:

  1. Все поля — final. То есть, после создания объект менять нельзя. Никаких «ой, а давай я тут x поправлю». Раз родился — таким и помрёшь.
  2. Сам конструктор помечен словечком const. Без этого — никакой магии, обычный пекарь.

Смотрите, как это выглядит в коде:

class ImmutablePoint {
  final double x;
  final double y;

  const ImmutablePoint(this.x, this.y); // Вот он, красавец!
}

void main() {
  // Используем магию const
  const point1 = ImmutablePoint(5.0, 10.0); // Пирожок №1 испечён и положен в холодильник.
  const point2 = ImmutablePoint(5.0, 10.0); // Ага, такой уже есть! Достаём из холодильника.

  print(identical(point1, point2)); // true — это один и тот же объект в памяти! Овердохуища!

  // А теперь без магии
  final point3 = ImmutablePoint(5.0, 10.0); // Леплю новый пирожок.
  final point4 = ImmutablePoint(5.0, 10.0); // Леплю ещё один, хоть и одинаковый.
  print(identical(point3, point4)); // false — два разных пирожка, два разных объекта. Пекарь устал.
}

А где это реально втыкают? Да везде, блядь! Особенно во Flutter'е. Там каждый чих — это виджет. И чтобы движок не сходил с ума, перестраивая одни и те же неизменные коробочки (SizedBox), тексты (Text) или отступы (Padding), их делают через const. Говоришь ему: «Эй, const SizedBox(height: 20), и он тебе не создаёт новый объект на каждом кадре, а тырит уже готовый из кэша. Умно, ёпта!

Так что запомни: const конструктор — это не просто прикол, это реальная оптимизация. Создал неизменяемый класс — сразу думай, не сделать ли конструктор const. Мозг компилятора скажет спасибо, а приложение будет летать.