若要使用无法在初始化程序列表中处理的逻辑初始化最终变量,可以使用工厂构造函数。尽管这种逻辑是一个简单的数学运算,但它显然违反了Dart的const协议。
我没有找到一种使用这种替代构造函数的方法,即允许我传递三个点而不是中心和半径,同时仍然保持最终对象的不可变性。
import 'dart:math';
class Circle {
final Point center;
final double radius;
const Circle(this.center, this.radius);
factory Circle.fromPoints(Point p1, Point p2, Point p3) {
Point center = _getCenter(p1, p2, p3);
return Circle(center, center.distanceTo(p1));
}
static Point _getCenter(Point p1, Point p2, Point p3) {
double centerX = ...
double centerY = ...
return Point(centerX, centerY);
}我还尝试将该getCenter方法公开,并在构造函数之外计算中心,但它再次失败,因为在初始化阶段计算的中心被确定为Null。
Point p1 = const Point(-1, 0);
Point p2 = const Point(0, 1);
Point p3 = const Point(1, 0);
Point center = Circle.getCenter(p1, p2, p2);
Circle circle = const Circle(center, center.distanceTo(p1));但是,我仍然更喜欢使用多个构造函数来生成const对象,而不是这样的解决方案。
发布于 2022-08-23 13:10:21
你可以得到一个不变的结果,但不是一个不变的结果。
对常量计算的限制是这样的,因此不允许调用const表达式中的任意几个函数(主要是数字上的运算符)。在常量计算期间,甚至不能提取x和y的Point位置。如果需要超出常量计算所允许的范围,则不能将计算作为常量表达式进行。还不能将非常量值传递给const构造函数调用。
这并不意味着结果不是一成不变的。它仍然是一个具有两个最终值的类,每个值都包含不可变的值。
因此,除了将const放在Circle(center, center.distanceTo(p1))前面之外,您所做的一切都很好,而且是正确的,因为第二个参数不是常量表达式。
https://stackoverflow.com/questions/73454902
复制相似问题