首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有计算字段的不可变类

具有计算字段的不可变类
EN

Stack Overflow用户
提问于 2022-08-23 07:45:40
回答 1查看 27关注 0票数 0

若要使用无法在初始化程序列表中处理的逻辑初始化最终变量,可以使用工厂构造函数。尽管这种逻辑是一个简单的数学运算,但它显然违反了Dart的const协议。

我没有找到一种使用这种替代构造函数的方法,即允许我传递三个点而不是中心和半径,同时仍然保持最终对象的不可变性。

代码语言:javascript
复制
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

代码语言:javascript
复制
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对象,而不是这样的解决方案。

EN

Stack Overflow用户

回答已采纳

发布于 2022-08-23 13:10:21

你可以得到一个不变的结果,但不是一个不变的结果。

对常量计算的限制是这样的,因此不允许调用const表达式中的任意几个函数(主要是数字上的运算符)。在常量计算期间,甚至不能提取xyPoint位置。如果需要超出常量计算所允许的范围,则不能将计算作为常量表达式进行。还不能将非常量值传递给const构造函数调用。

这并不意味着结果不是一成不变的。它仍然是一个具有两个最终值的类,每个值都包含不可变的值。

因此,除了将const放在Circle(center, center.distanceTo(p1))前面之外,您所做的一切都很好,而且是正确的,因为第二个参数不是常量表达式。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73454902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档