[TOC]
通过声明与类具有相同名称的函数以及可选的附加标识符来创建Dart构造函数。后者称为命名构造函数。
## 优先定义构造函数而不是静态方法来创建实例。
构造函数使用new或调用const,它传达调用的主要目的是返回类的实例(或至少是实现其接口的东西)。
您永远不需要使用静态方法来创建实例。命名构造函数允许您阐明如何创建对象,工厂构造函数允许您在适当时构造子类或子接口的实例。
尽管如此,一些技术上创建新对象的方法并不像“类似构造函数”。例如,Uri.parse()即使它从给定的参数创建一个新URI ,也是一个静态方法。同样,使用静态方法可以更好地读取实现Builder模式的类。
但是,在大多数情况下,你应该使用构造函数,即使它更冗长。当用户想要一个新的类实例时,他们希望构造函数是创建一个实例的常规方法。
~~~
class Point {
num x, y;
Point(this.x, this.y);
Point.polar(num theta, num radius)
: x = radius * cos(theta),
y = radius * sin(theta);
}
~~~
以下是反面例子:
~~~
class Point {
num x, y;
Point(this.x, this.y);
static Point polar(num theta, num radius) =>
Point(radius * cos(theta), radius * sin(theta));
}
~~~
## const如果类支持它,请考虑构造函数。
如果你有一个所有字段都是final的类,并且构造函数除了初始化它们之外什么都不做,你可以创建那个构造函数const。这允许用户在需要常量的位置创建类的实例 -- 在其他更大的常量,切换案例,默认参数值等内部。
如果你没有明确地做到const,他们就无法做到。
但请注意,const构造函数是您的公共API中的承诺。如果稍后将构造函数更改为非构造函数const,则会破坏在常量表达式中调用它的用户。如果您不想承诺,请不要这样做const。实际上,const构造函数对于简单的,不可变的数据记录类很有用。