Ответ
Обычный (или главный) конструктор используется для стандартного создания экземпляра класса. В Dart его можно объявить кратко: ClassName(this.param1, this.param2).
Именованный конструктор дает альтернативный способ создания объекта с явным указанием цели через ClassName.constructorName().
Основные различия:
- Количество: У класса может быть только один обычный конструктор, но несколько именованных.
- Читаемость: Именованные конструкторы делают намерение в коде более понятным (например,
fromJson,fromCache,anonymous). - Гибкость: Позволяют создавать объекты разными путями, не перегружая параметры главного конструктора.
Пример:
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.