Какие типы конструкторов существуют в Dart?

«Какие типы конструкторов существуют в Dart?» — вопрос из категории ООП, который задают на 29% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Dart есть несколько типов конструкторов, каждый решает свою задачу:

1. Стандартный конструктор:

class Point {
  double x, y;
  Point(this.x, this.y); // Сокращённая инициализация
}

2. Именованный конструктор (named constructor): Позволяет создавать объекты альтернативными способами.

class Point {
  double x, y;
  Point(this.x, this.y);

  Point.origin() : x = 0, y = 0; // Именованный конструктор
  Point.fromJson(Map<String, double> json) : x = json['x']!, y = json['y']!;
}

3. Конструктор с перенаправлением (redirecting constructor): Перенаправляет вызов другому конструктору того же класса.

class Point {
  double x, y;
  Point(this.x, this.y);
  Point.alongXAxis(double x) : this(x, 0); // Вызывает Point(x, 0)
}

4. Фабричный конструктор (factory constructor): Используется, когда создание экземпляра требует логики (кеширование, возврат подтипа).

class Logger {
  final String name;
  static final Map<String, Logger> _cache = {};

  factory Logger(String name) {
    return _cache.putIfAbsent(name, () => Logger._internal(name));
  }
  Logger._internal(this.name); // Приватный конструктор
}

5. Константный конструктор (const constructor): Создаёт compile-time константы, все поля должны быть final.

class ImmutablePoint {
  final double x, y;
  const ImmutablePoint(this.x, this.y);
}
// Использование:
const p1 = ImmutablePoint(1, 2);
const p2 = ImmutablePoint(1, 2);
print(identical(p1, p2)); // true — это один и тот же объект в памяти