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

时间:2015-03-18 23:16:28

标签: constructor dart

我正在编写一个不可变类Vector3。

class Vector3
{
  final num x, y, z;
  Vector3(this.x, this.y, this.z);
  num get length => ...some heavy code
}

现在,我想编写一个构造函数来计算另一个向量的单位向量。我想根据Dart的建议做到这一点(避免在创建新对象时编写静态方法)。

我的问题是我无法编写这个构造函数,因为最终的字段必须在构造函数的主体之前初始化,并且无法在内部初始化。我可以这样写:

Vector3.unit(Vector3 vector)
  : x = vector.x / vector.length,
    y = vector.y / vector.length,
    z = vector.z / vector.length;

但是这太可悲了,我必须计算矢量长度的三倍......

我该怎么做?我应该最终写一个静态方法来计算单位向量吗? (这将是一种耻辱)

而且,最后,是否有可能在构造函数的主体中写入与最终字段的初始化相关的任何内容?为什么?

谢谢!

1 个答案:

答案 0 :(得分:5)

使用工厂构造函数:

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
}