[英]Dart: How does Dart match the named parameters in a Constructor of a Class?
[英]Right way of using optional named parameters in Dart class constructor
飛鏢菜鳥在這里。 我定義了一個類如下:
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 類的正確方法嗎? 有沒有更好的辦法?
編寫此代碼的慣用方法是:
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 中具有可見的 setter。
如果您確實希望字段是可變的,那么您可以刪除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
實際上只寫入一次。 (不過,我通過將其_sub
私有來避免在 API 中暴露_sub
setter。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.