这是来自Dart样本(时钟样本)的类Ball的一部分:
DivElement root
num lastTime;
List<Ball> balls;
球():
lastTime = new Date.now().millisecondsSinceEpoch,
balls = new List<Ball>() { \\I do not understand here, why use
root = new DivElement(); \\ List<Ball>(){...}
document.body.nodes.add(root);
makeAbsolute(root);
setElementSize(root, 0.0, 0.0, 0.0, 0.0);
}
因为我不明白,我改变了构造函数:
Balls() {
lastTime = new Date.now().millisecondsSinceEpoch;
balls = new List<Ball>() ;
root = new DivElement();
document.body.nodes.add(root);
makeAbsolute(root);
setElementSize(root, 0.0, 0.0, 0.0, 0.0);
}
该应用程序仍然有效。构造函数Ball():
and Ball(){}
之间是否存在差异?谢谢。
抱歉我的英文。
答案 0 :(得分:2)
两个版本都应该可以正常工作。 :
表示法中的代码在构造函数体之前运行,因此它经常用于调用super:
class Person {
String name;
Person(this.name);
}
class Employee extends Person {
Employee(name) : super(name) {
print('ran after the super call');
}
}
我认为函数体是一种更干净的方法,我相信“球”示例想要展示不同的样式,因为你也可以内联初始化值。
我通常使用函数体方法,除非它看起来更干净或者我正在调用父构造函数。
更新:Ladicek增加了公平分数。您可以内联或在初始化列表中初始化final
字段。与某些语言不同,在Dart中可以保证字段永远不会处于未初始化状态。记住初始化程序按列出的顺序运行也很好。