Ответ
В 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 — это один и тот же объект в памяти