在 Dart 中,命名构造函数是一种为类定义多个构造方法的方法,使你可以根据需要提供有意义的名称。这对于提高代码的可读性和灵活性非常有用,尤其是在需要不同的初始化过程时。
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'] ?? 0,
y = json['y'] ?? 0;
}
void main() {
// 使用默认构造函数
var p1 = Point(2, 3);
print('p1: (${p1.x}, ${p1.y})');
// 使用命名构造函数
var p2 = Point.origin();
print('p2: (${p2.x}, ${p2.y})');
// 从 JSON 初始化
var p3 = Point.fromJson({'x': 4, 'y': 5});
print('p3: (${p3.x}, ${p3.y})');
}
Point(this.x, this.y) 是一种简洁的语法,称为构造函数参数初始化列表,用于在构造函数中直接初始化类的字段。等价于:
class Point {
double x, y;
Point(double x, double y) {
this.x = x;
this.y = y;
}
}
这种初始化列表也可以与可选参数和默认值结合使用,以提高灵活性。例如:
class Point {
double x, y;
//x 和 y 都是可选参数,并且都有默认值 0
Point([this.x = 0, this.y = 0]);
}
调用:
void main() {
// 不传入任何参数,使用默认值
var p1 = Point();
print('p1: (${p1.x}, ${p1.y})'); // 输出: p1: (0.0, 0.0)
// 传入一个参数,第二个参数使用默认值
var p2 = Point(5);
print('p2: (${p2.x}, ${p2.y})'); // 输出: p2: (5.0, 0.0)
// 传入两个参数,覆盖默认值
var p3 = Point(3, 4);
print('p3: (${p3.x}, ${p3.y})'); // 输出: p3: (3.0, 4.0)
}
命名构造函数的主要用途包括: