构造函数如何使用复杂算法初始化最终字段?

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 字段的初始化相关的任何内容?为什么?

谢谢!

使用 factory constructor:

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
}