← Назад к вопросам

Как создается константный объект?

1.2 Junior🔥 141 комментариев
#ООП и паттерны

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как создается константный объект?

Константный объект в Dart — это объект, который после создания не может быть изменен. Это один из ключевых принципов функционального программирования, позволяющий избежать побочных эффектов и улучшить производительность приложения.

Создание константного объекта через const

Для создания константного объекта используется ключевое слово const:

const myObject = MyClass(10, "Иван");

При этом необходимо, чтобы класс был подготовлен для создания константных объектов.

Подготовка класса для const объектов

Для создания константного объекта все его поля должны быть финальными (final), и конструктор должен быть помечен как const:

class Person {
  final int age;
  final String name;
  final String email;
  
  const Person({
    required this.age,
    required this.name,
    required this.email,
  });
}

Важные правила для const конструктора

Все поля должны быть final:

class Point {
  final int x;
  final int y;
  
  const Point(this.x, this.y);  // ✅ Правильно
}

class BadPoint {
  int x;  // ❌ Ошибка: не final
  int y;
  
  const BadPoint(this.x, this.y);
}

Инициализация должна быть в конструкторе:

class Rectangle {
  final int width;
  final int height;
  
  // ✅ Правильно
  const Rectangle({required this.width, required this.height});
  
  // ❌ Неправильно: инициализация с default значением
  // const Rectangle({this.width = 0, this.height = 0});
}

Различие между const и final

const — это value type, константа на момент компиляции. Несколько переменных, инициализированных одинаковыми const значениями, будут указывать на один объект в памяти:

const p1 = Point(10, 20);
const p2 = Point(10, 20);

print(identical(p1, p2));  // true — один объект

final — это значение, которое не может быть изменено после инициализации, но каждый раз может создаваться новый объект:

final p1 = Point(10, 20);
final p2 = Point(10, 20);

print(identical(p1, p2));  // false — разные объекты

Практический пример: Widget во Flutter

Все Widget в Flutter должны создаваться с const конструктором для оптимизации производительности:

class MyButton extends StatelessWidget {
  final String label;
  final VoidCallback onPressed;
  
  // const конструктор
  const MyButton({
    required this.label,
    required this.onPressed,
  });
  
  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: onPressed,
      child: Text(label),
    );
  }
}

// Использование
const MyButton(
  label: "Нажми меня",
  onPressed: handlePress,
);

Const объекты в коллекциях

// ✅ Const список
const myList = [1, 2, 3, 4, 5];

// ✅ Const Map
const myMap = {
  "name": "Иван",
  "age": 25,
  "email": "ivan@example.com",
};

// ✅ Const Set
const mySet = {1, 2, 3, 4, 5};

Преимущества const объектов

  • Интерн листинг — несколько одинаковых const объектов занимают одну ячейку памяти
  • Производительность — при сравнении identical() работает быстрее
  • Безопасность типов — гарантирует неизменяемость на уровне компилятора
  • Оптимизация Flutter — Widget rebuild срабатывает только при изменении параметров

Частые ошибки

// ❌ Ошибка: не все поля final
class Bad {
  int value;  // не final
  const Bad(this.value);
}

// ❌ Ошибка: нельзя инициализировать модифицируемое поле
const obj = Bad(value: []);

// ✅ Правильно
class Good {
  final int value;
  final List<int> items;
  const Good({required this.value, required this.items});
}

Константные объекты — это основа производительности и безопасности в Dart и Flutter приложениях.

Как создается константный объект? | PrepBro