构造函数如何使用复杂算法初始化最终字段?
How constructors can initialize final fields with complex algorithm?
我正在写一个不可变的 class Vector3.
class Vector3
{
final num x, y, z;
Vector3(this.x, this.y, this.z);
num get length => ...some heavy code
}
现在,我想编写一个构造函数,从另一个向量计算单位向量。我想根据 Dart 的建议来做(避免在创建新对象时编写静态方法)。
我的问题是我不能写这个构造函数,因为final字段必须在构造函数体之前初始化,不能在里面初始化。我可以这样写:
Vector3.unit(Vector3 vector)
: x = vector.x / vector.length,
y = vector.y / vector.length,
z = vector.z / vector.length;
但这太可悲了,我不得不计算向量长度的三倍...
我该怎么做?我最终是否应该编写一个静态方法来计算单位向量? (太可惜了)
最后,是不是可以在构造函数的主体中写入与 final 字段的初始化相关的任何内容?为什么?
谢谢!
class Vector3
{
final num x, y, z;
Vector3(this.x, this.y, this.z);
factory Vector3.unit(Vector3 vector) {
var length = vector.length;
return new Vector3(vector.x/length, vector.y/length, vector.z/length);
}
num get length => ...some heavy code
}
我正在写一个不可变的 class Vector3.
class Vector3
{
final num x, y, z;
Vector3(this.x, this.y, this.z);
num get length => ...some heavy code
}
现在,我想编写一个构造函数,从另一个向量计算单位向量。我想根据 Dart 的建议来做(避免在创建新对象时编写静态方法)。
我的问题是我不能写这个构造函数,因为final字段必须在构造函数体之前初始化,不能在里面初始化。我可以这样写:
Vector3.unit(Vector3 vector)
: x = vector.x / vector.length,
y = vector.y / vector.length,
z = vector.z / vector.length;
但这太可悲了,我不得不计算向量长度的三倍...
我该怎么做?我最终是否应该编写一个静态方法来计算单位向量? (太可惜了)
最后,是不是可以在构造函数的主体中写入与 final 字段的初始化相关的任何内容?为什么?
谢谢!
class Vector3
{
final num x, y, z;
Vector3(this.x, this.y, this.z);
factory Vector3.unit(Vector3 vector) {
var length = vector.length;
return new Vector3(vector.x/length, vector.y/length, vector.z/length);
}
num get length => ...some heavy code
}