首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Dart类构造函数中使用可选命名参数的正确方法

在Dart类构造函数中使用可选命名参数的正确方法
EN

Stack Overflow用户
提问于 2021-11-13 06:20:00
回答 1查看 47关注 0票数 0

我是达特·诺布。我定义了一个类如下:

代码语言:javascript
复制
class Balance{
  String ccy;
  late Money receivable;
  late Money payable;
  Balance(this.ccy, {Money? receivable, Money? payable}){
   this.receivable = receivable??Money.from(0, code:ccy);
   this.payable = payable??Money.from(0, code:ccy);
  };
}

我将其定义如下:

  1. I希望应付款和应收账款字段永远不会为空,但同时,每当创建Balance对象时,我不希望总是传递这些字段的值。
  2. ,我希望需要ccy参数,并使用该参数将应付款和应收账款字段初始化为0.

这是定义Balance类的正确方法吗?有更好的办法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-15 10:44:55

编写此代码的惯用方法是:

代码语言:javascript
复制
class Balance{
  final String currency;
  final Money receivable;
  final Money payable;
  Balance(this.currency, {Money? receivable, Money? payable}) 
      : receivable = receivable ?? Money.from(0, code: currency),
        payable = payable ?? Money.from(0, code: currency);
}

(加上文件!)

通过初始化初始化程序列表中的字段(正因为这个原因而存在),您可以使用依赖于参数的计算使字段成为最终字段和非空字段。

我从来不会在公共领域使用late。在本例中,您实际上是在构造函数中立即初始化它,因此类的客户端在初始化字段之前不会意外地读取该字段。他们只是不知道,他们所看到的只是字段是late。即使您将字段设置为final,没有初始化器的late final字段在公共API中仍然可以看到一个设置器。

如果实际上希望字段是可变的,那么可以删除final。那么,只要您仍然确保在其他人看到对象之前对字段进行初始化,那么late就没有那么糟糕了。然后,您仍然通常会像我在这里所做的那样,避免使用late

您可能需要late的一种情况是需要创建最终字段的循环结构。有点像

代码语言:javascript
复制
class MainNode {
  final String name;
  late final SubNode _sub;
  MainNode(this.name, String data) {
    _sub = SubNode(this, data);
  }
  SubNode get sub => _sub; 
}
class SubNode {
  final MainNode parent;
  String data;
  SubNode(this.parent, this.data);
}

对于这种情况,您需要在访问this之后创建子节点,late final字段是有意义的,并确保_sub实际上只编写了一次。(不过,我避免在API中公开_sub设置器,因为它是私有的。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69951953

复制
相关文章

相似问题

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