簡體   English   中英

在 Dart 類構造函數中使用可選命名參數的正確方法

[英]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);
  };
}

我把它定義為上面的原因是:

  1. 我希望應付款和應收款字段永遠不會為空,但同時,我不想在創建 Balance 對象時總是為這些字段傳遞值。
  2. 我希望需要 ccy 參數並使用該參數將應付賬款和應收賬款字段初始化為 0。

這是定義 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM