В чем разница между обычным и именованным конструктором в Dart?

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

Ответ

Обычный (или главный) конструктор используется для стандартного создания экземпляра класса. В Dart его можно объявить кратко: ClassName(this.param1, this.param2).

Именованный конструктор дает альтернативный способ создания объекта с явным указанием цели через ClassName.constructorName().

Основные различия:

  1. Количество: У класса может быть только один обычный конструктор, но несколько именованных.
  2. Читаемость: Именованные конструкторы делают намерение в коде более понятным (например, fromJson, fromCache, anonymous).
  3. Гибкость: Позволяют создавать объекты разными путями, не перегружая параметры главного конструктора.

Пример:

class User {
  String name;
  String email;
  DateTime? registrationDate;

  // Обычный конструктор
  User(this.name, this.email, {DateTime? registrationDate}) 
    : this.registrationDate = registrationDate ?? DateTime.now();

  // Именованный конструктор для создания из JSON
  User.fromJson(Map<String, dynamic> json) 
    : name = json['name'],
      email = json['email'],
      registrationDate = DateTime.parse(json['registered_at']);

  // Именованный конструктор для гостевого пользователя
  User.guest() 
    : name = 'Guest',
      email = 'guest@example.com',
      registrationDate = DateTime.now();
}

// Использование:
final mainUser = User('Alice', 'alice@example.com');
final jsonUser = User.fromJson(fetchedData);
final guestUser = User.guest();

Именованные конструкторы — это мощный инструмент для улучшения читаемости и структуры кода на Dart.