这里是对最终类变量的初始化方法的简化总结。
class MyClass {
final int x; // <-- initialize this
}
初始化值
class MyClass {
final int x = 'hello'.length;
}
如果初始化只能在运行时完成,您只能使用final。否则,static const 更好:
class MyClass {
static const int x = 0;
}
初始化程序正式
class MyClass {
MyClass(this.x);
final int x;
}
这是最常用的方法。
初始化列表
class MyClass {
MyClass(int x)
: _x = x;
final int _x;
}
当您想保持字段私有时,这很有用。
默认参数值
对于未命名的参数,您可以用方括号 ([]) 将参数括起来,对于已命名的参数,您可以使用大括号 ({}) 括起来,然后给它一个默认值。
class MyClass {
MyClass({this.x = 0});
final int x;
}
如果您想使参数可选,这很有用。
你也可以用初始化列表来完成同样的事情:
class MyClass {
MyClass({int? x})
: _x = x ?? 0;
final int _x;
}
延迟初始化
class MyClass {
MyClass(String? a) {
x = a?.length ?? 0;
}
late final int x;
}
如果您需要进行比初始化列表中允许的更复杂的初始化,这很有用。例如,我在 Flutter 中初始化手势识别器时就这样做了。
延迟初始化
使用late 的另一个优点是它在您访问该值之前不会初始化该值。
class MyClass {
late final int x = _doHeavyTask();
int _doHeavyTask() {
var sum = 0;
for (var i = 0; i < 100000000; i++) {
sum += 1;
}
return sum;
}
}
如果您有一个繁重的计算,而您只想在绝对需要时调用它,这将非常有用。
这不会初始化x:
final myClass = MyClass();
但这确实会初始化x:
final myClass = MyClass();
final value = myClass.x;