在 Dart 中,构造函数可以使用简写方式,使代码更加简洁易读。下面是几种常见的构造函数简写方式:
1. 普通构造函数的简写
通常,我们需要手动给类的字段赋值,但可以用 this.
关键字简写。
🔹 传统方式
class Person {
String name;
int age;
// 传统写法:在构造函数中手动赋值
Person(String name, int age) {
this.name = name;
this.age = age;
}
}
✅ 简写方式
class Person {
String name;
int age;
// 直接在参数列表中使用 this 关键字,省去手动赋值
Person(this.name, this.age);
}
📌 作用:
-
this.name
直接赋值给类的字段name
,不需要在构造体内写this.name = name
。
2. 可选参数的简写
🔹 传统写法
class Person {
String name;
int age;
Person(String name, [int age = 18]) {
this.name = name;
this.age = age;
}
}
✅ 简写方式
class Person {
String name;
int age;
// 使用 [] 使 age 变成可选参数
Person(this.name, [this.age = 18]);
}
📌 作用:
- 让
age
变成可选参数,默认值18
。 - 省去
this.age = age;
的赋值操作。
3. 命名参数的简写
🔹 传统写法
class Person {
String name;
int age;
Person({String name = "Unknown", int age = 18}) {
this.name = name;
this.age = age;
}
}
✅ 简写方式
class Person {
String name;
int age;
// 直接在参数列表中使用 this
Person({this.name = "Unknown", this.age = 18});
}
📌 作用:
- 让
name
和age
变成命名参数,可以在调用时指定参数名。 - 省去
this.name = name;
的赋值操作。
📌 调用方式
void main() {
var p1 = Person();
var p2 = Person(name: "Alice");
var p3 = Person(age: 25);
var p4 = Person(name: "Bob", age: 30);
}
4. required
关键字的简写
适用于:强制要求某些参数必须传递
🔹 传统写法
class Person {
String name;
int age;
Person({required String name, required int age}) {
this.name = name;
this.age = age;
}
}
✅ 简写方式
class Person {
String name;
int age;
// 直接在构造函数参数中使用 this 和 required
Person({required this.name, required this.age});
}
📌 作用:
-
required
确保name
和age
必须传递,否则编译报错。 -
省去
this.name = name;
赋值操作。
📌 调用方式
void main() {
var p = Person(name: "Alice", age: 25); // ✅ 正常
// var p2 = Person(name: "Bob"); // ❌ 报错,age 必填
}
5. const
构造函数的简写
适用于:不可变对象
🔹 传统写法
class Person {
final String name;
final int age;
const Person({required String name, required int age})
: name = name,
age = age;
}
✅ 简写方式
class Person {
final String name;
final int age;
const Person({required this.name, required this.age});
}
📌 作用:
-
const
让类的对象变成编译时常量,提高性能。 - 只能用于
final
成员变量。 - 省去
: name = name, age = age;
的初始化代码。
📌 调用方式
void main() {
const p1 = Person(name: "Alice", age: 25);
const p2 = Person(name: "Alice", age: 25);
print(identical(p1, p2)); // true,两者指向同一个对象
}
6. 工厂构造函数的简写
适用于:
- 返回缓存对象(单例模式)
- 自定义实例化逻辑
🔹 传统写法
class Singleton {
static final Singleton _instance = Singleton._internal();
Singleton._internal(); // 私有构造函数
factory Singleton() {
return _instance;
}
}
✅ 简写方式
class Singleton {
static final Singleton _instance = Singleton._();
Singleton._(); // 私有构造函数
factory Singleton() => _instance;
}
📌 作用:
-
factory
让构造函数可以返回已有实例(比如缓存数据)。 - 省去
return _instance;
代码,提高可读性。
📌 调用方式
void main() {
var s1 = Singleton();
var s2 = Singleton();
print(identical(s1, s2)); // true,两个实例是相同的
}
7. late
变量的简写
适用于:
- 稍后赋值的变量
- 避免
null
检查
🔹 传统写法
class Person {
late String name;
int age;
Person({required String name, this.age = 18}) {
this.name = name; // 必须在构造方法中赋值
}
}
✅ 简写方式
class Person {
late String name;
int age;
Person({required this.name, this.age = 18});
}
📌 作用:
- 让
late
变量在构造函数中直接赋值,避免手动赋值代码。
总结
简写方式 | 作用 |
---|---|
this. 赋值 |
省去手动赋值 |
[] 位置可选参数 |
让参数可选,并提供默认值 |
{} 命名参数 |
让参数更具可读性 |
required 关键字 |
强制要求必须传递参数 |
const 构造函数 |
让对象成为编译时常量 |
factory 构造函数 |
允许返回缓存对象或自定义实例化逻辑 |
late 变量 |
允许稍后赋值,避免 null 检查 |
这样,你可以根据不同场景选择最适合的构造函数简写方式,使代码更加清晰和易读! 🚀