[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構造函數對于簡單的,不可變的數據記錄類很有用。