我是达特·诺布。我定义了一个类如下:
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);
};
}我将其定义如下:
。
这是定义Balance类的正确方法吗?有更好的办法吗?
发布于 2021-11-15 10:44:55
编写此代码的惯用方法是:
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的一种情况是需要创建最终字段的循环结构。有点像
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设置器,因为它是私有的。)
https://stackoverflow.com/questions/69951953
复制相似问题