在 Dart 中,構(gòu)造函數(shù)可以使用簡(jiǎn)寫(xiě)方式,使代碼更加簡(jiǎn)潔易讀。下面是幾種常見(jiàn)的構(gòu)造函數(shù)簡(jiǎn)寫(xiě)方式:
1. 普通構(gòu)造函數(shù)的簡(jiǎn)寫(xiě)
通常,我們需要手動(dòng)給類的字段賦值,但可以用 this.
關(guān)鍵字簡(jiǎn)寫(xiě)。
?? 傳統(tǒng)方式
class Person {
String name;
int age;
// 傳統(tǒng)寫(xiě)法:在構(gòu)造函數(shù)中手動(dòng)賦值
Person(String name, int age) {
this.name = name;
this.age = age;
}
}
? 簡(jiǎn)寫(xiě)方式
class Person {
String name;
int age;
// 直接在參數(shù)列表中使用 this 關(guān)鍵字,省去手動(dòng)賦值
Person(this.name, this.age);
}
?? 作用:
-
this.name
直接賦值給類的字段name
,不需要在構(gòu)造體內(nèi)寫(xiě)this.name = name
。
2. 可選參數(shù)的簡(jiǎn)寫(xiě)
?? 傳統(tǒng)寫(xiě)法
class Person {
String name;
int age;
Person(String name, [int age = 18]) {
this.name = name;
this.age = age;
}
}
? 簡(jiǎn)寫(xiě)方式
class Person {
String name;
int age;
// 使用 [] 使 age 變成可選參數(shù)
Person(this.name, [this.age = 18]);
}
?? 作用:
- 讓
age
變成可選參數(shù),默認(rèn)值18
。 - 省去
this.age = age;
的賦值操作。
3. 命名參數(shù)的簡(jiǎn)寫(xiě)
?? 傳統(tǒng)寫(xiě)法
class Person {
String name;
int age;
Person({String name = "Unknown", int age = 18}) {
this.name = name;
this.age = age;
}
}
? 簡(jiǎn)寫(xiě)方式
class Person {
String name;
int age;
// 直接在參數(shù)列表中使用 this
Person({this.name = "Unknown", this.age = 18});
}
?? 作用:
- 讓
name
和age
變成命名參數(shù),可以在調(diào)用時(shí)指定參數(shù)名。 - 省去
this.name = name;
的賦值操作。
?? 調(diào)用方式
void main() {
var p1 = Person();
var p2 = Person(name: "Alice");
var p3 = Person(age: 25);
var p4 = Person(name: "Bob", age: 30);
}
4. required
關(guān)鍵字的簡(jiǎn)寫(xiě)
適用于:強(qiáng)制要求某些參數(shù)必須傳遞
?? 傳統(tǒng)寫(xiě)法
class Person {
String name;
int age;
Person({required String name, required int age}) {
this.name = name;
this.age = age;
}
}
? 簡(jiǎn)寫(xiě)方式
class Person {
String name;
int age;
// 直接在構(gòu)造函數(shù)參數(shù)中使用 this 和 required
Person({required this.name, required this.age});
}
?? 作用:
-
required
確保name
和age
必須傳遞,否則編譯報(bào)錯(cuò)。 -
省去
this.name = name;
賦值操作。
?? 調(diào)用方式
void main() {
var p = Person(name: "Alice", age: 25); // ? 正常
// var p2 = Person(name: "Bob"); // ? 報(bào)錯(cuò),age 必填
}
5. const
構(gòu)造函數(shù)的簡(jiǎn)寫(xiě)
適用于:不可變對(duì)象
?? 傳統(tǒng)寫(xiě)法
class Person {
final String name;
final int age;
const Person({required String name, required int age})
: name = name,
age = age;
}
? 簡(jiǎn)寫(xiě)方式
class Person {
final String name;
final int age;
const Person({required this.name, required this.age});
}
?? 作用:
-
const
讓類的對(duì)象變成編譯時(shí)常量,提高性能。 - 只能用于
final
成員變量。 - 省去
: name = name, age = age;
的初始化代碼。
?? 調(diào)用方式
void main() {
const p1 = Person(name: "Alice", age: 25);
const p2 = Person(name: "Alice", age: 25);
print(identical(p1, p2)); // true,兩者指向同一個(gè)對(duì)象
}
6. 工廠構(gòu)造函數(shù)的簡(jiǎn)寫(xiě)
適用于:
- 返回緩存對(duì)象(單例模式)
- 自定義實(shí)例化邏輯
?? 傳統(tǒng)寫(xiě)法
class Singleton {
static final Singleton _instance = Singleton._internal();
Singleton._internal(); // 私有構(gòu)造函數(shù)
factory Singleton() {
return _instance;
}
}
? 簡(jiǎn)寫(xiě)方式
class Singleton {
static final Singleton _instance = Singleton._();
Singleton._(); // 私有構(gòu)造函數(shù)
factory Singleton() => _instance;
}
?? 作用:
-
factory
讓構(gòu)造函數(shù)可以返回已有實(shí)例(比如緩存數(shù)據(jù))。 - 省去
return _instance;
代碼,提高可讀性。
?? 調(diào)用方式
void main() {
var s1 = Singleton();
var s2 = Singleton();
print(identical(s1, s2)); // true,兩個(gè)實(shí)例是相同的
}
7. late
變量的簡(jiǎn)寫(xiě)
適用于:
- 稍后賦值的變量
- 避免
null
檢查
?? 傳統(tǒng)寫(xiě)法
class Person {
late String name;
int age;
Person({required String name, this.age = 18}) {
this.name = name; // 必須在構(gòu)造方法中賦值
}
}
? 簡(jiǎn)寫(xiě)方式
class Person {
late String name;
int age;
Person({required this.name, this.age = 18});
}
?? 作用:
- 讓
late
變量在構(gòu)造函數(shù)中直接賦值,避免手動(dòng)賦值代碼。
總結(jié)
簡(jiǎn)寫(xiě)方式 | 作用 |
---|---|
this. 賦值 |
省去手動(dòng)賦值 |
[] 位置可選參數(shù) |
讓參數(shù)可選,并提供默認(rèn)值 |
{} 命名參數(shù) |
讓參數(shù)更具可讀性 |
required 關(guān)鍵字 |
強(qiáng)制要求必須傳遞參數(shù) |
const 構(gòu)造函數(shù) |
讓對(duì)象成為編譯時(shí)常量 |
factory 構(gòu)造函數(shù) |
允許返回緩存對(duì)象或自定義實(shí)例化邏輯 |
late 變量 |
允許稍后賦值,避免 null 檢查 |
這樣,你可以根據(jù)不同場(chǎng)景選擇最適合的構(gòu)造函數(shù)簡(jiǎn)寫(xiě)方式,使代碼更加清晰和易讀! ??