Sobes.tech
Назад к вопросам
Junior — Middle
75

Чем отличаются модификаторы final и const в языке программирования?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

final и const оба используются для запрета повторного изменения значения, но делают это на разных этапах. final задаёт значение один раз во время выполнения, а const — это compile-time константа, известная ещё на этапе компиляции. В Flutter важно помнить, что const часто ещё и помогает оптимизировать дерево виджетов.

Определение:

final — это переменная, которую можно присвоить только один раз. После первого присваивания её значение менять нельзя, но само значение может быть вычислено во время выполнения.

const — это неизменяемая константа, значение которой должно быть известно на этапе компиляции. В Dart const делает объект каноническим: одинаковые const-объекты могут переиспользоваться как один и тот же экземпляр.

Пример использования:

void main() {
  final currentTime = DateTime.now(); // значение известно только во время выполнения

  const pi = 3.14159; // значение известно на этапе компиляции

  final list = [1, 2, 3];
  list.add(4); // допустимо: сам объект изменяемый

  const fixedList = [1, 2, 3];
  // fixedList.add(4); // ошибка: const-список неизменяем

  const a = [1, 2];
  const b = [1, 2];
  print(identical(a, b)); // true
}

Пояснение кода:

  • final currentTime = DateTime.now(); — значение создаётся в момент запуска программы, поэтому const здесь использовать нельзя.
  • const pi = 3.14159; — число известно заранее, поэтому подходит const.
  • final list = [1, 2, 3]; — переменная list не может указывать на другой список, но сам список остаётся изменяемым.
  • const fixedList = [1, 2, 3]; — список и его содержимое становятся неизменяемыми.
  • identical(a, b) возвращает true, потому что одинаковые const-объекты могут быть представлены одним экземпляром.

Ключевые моменты:

  • final — одноразовое присваивание, но значение может быть вычислено во время выполнения.
  • const — константа времени компиляции, объект неизменяем.
  • final не делает объект внутри переменной неизменяемым, только саму ссылку.
  • const в Flutter полезен для оптимизации и уменьшения лишних перестроений виджетов.
  • Если значение зависит от DateTime.now(), Random, данных API и других runtime-источников, обычно нужен final, а не const.