Что такое redirecting constructor в Dart?

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

Ответ

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

Синтаксис и пример:

class Rectangle {
  final double width;
  final double height;
  final String label;

  // Основной конструктор
  Rectangle(this.width, this.height, [this.label = 'Rectangle']);

  // Redirecting конструктор для создания квадрата.
  // Он просто вызывает основной конструктор, подставляя height = width.
  Rectangle.square(double sideLength) : this(sideLength, sideLength, 'Square');

  // Ещё один redirecting конструктор с преобразованием параметров.
  Rectangle.fromMap(Map<String, double> dimensions)
      : this(dimensions['width'] ?? 0.0, dimensions['height'] ?? 0.0);
}

void main() {
  final rect = Rectangle(10, 20);
  final square = Rectangle.square(15); // Вызовет Rectangle(15, 15, 'Square')
  final fromMap = Rectangle.fromMap({'width': 5, 'height': 7});
}

Ключевые особенности:

  1. Нет тела: После двоеточия (:) может быть только вызов this(...).
  2. Нет initializer list: Нельзя использовать : width = 10, height = 20.
  3. Цель — избежать дублирования: Вся логика инициализации сосредоточена в основном конструкторе.
  4. Удобство для API: Позволяет предоставить пользователю класса более интуитивно понятные имена методов создания (например, Point.polar(radius, angle)).