Dart 中该何时使用初始化列表

在 Dart 中有以下 4 种方式来初始化实例变量。

  1. 在实例变量声明时初始化
1
2
3
class Point {
var x = 0, y = 0;
}
  1. 使用构造函数初始化
1
2
3
4
class Point {
var x, y;
Point(this.x, this.y);
}
  1. 通过初始化列表(initializer list)
1
2
3
4
class Point {
var x, y;
Point(a, b) : x = a, y = b;
}
  1. 构造函数中初始化
1
2
3
4
5
6
7
class Point {
var x, y;
Point(a, b) {
x = a;
y = b;
}
}

最后一种方法不适用于 final 实例变量,因为 final 变量没有 setter 方法。且只能初始化一次,所以只能在前三种方式中选择一种。

那么,什么情况下只能使用初始化列表来进行实例化成员变量呢?

比如我们有以下一个类,它的两个 final 的成员变量值 sum,factor 都是通过 x,y 计算得来的,所以我们不能使用 this.sum 这样的初始化方式。同时因为 final 字段没有 setter 方法(Dart 中的赋值语句就是 setter 方法的语法糖),所以也不能在构造函数中给这些字段赋值。此时我们就可以通过初始化列表解决如何在代码运行前给实例变量进行初始化的问题。

1
2
3
4
class Point {
final sum, factor;
Point(x, y) : sum = x + y, factor = x / y;
}