簡體   English   中英

Dart 命名構造函數、static 方法和工廠構造函數

[英]Dart named constructor, static method, and factory constructor

給定以下代碼:

const jsonString = '{"myString":"Hello"}';
final jsonMap = jsonDecode(jsonString);

final myObject = MyClass.fromJson(jsonMap);

使用以下語法創建新的 object 有多少種方法:

MyClass.fromJson(jsonMap)

最近,我一直在嘗試了解命名構造函數、工廠構造函數和 static 方法之間的區別,所以我在下面發布我的答案,以便將來有一些東西可以作為參考。

使用以下語法創建 object 的新實例:

MyClass.fromJson(jsonMap)

與以下代碼一起使用:

// import 'dart:convert';

const jsonString = '{"myString":"Hello"}';
final jsonMap = jsonDecode(jsonString);

final myObject = MyClass.fromJson(jsonMap);

至少有以下幾種方法(附有關於每種特征的補充說明):

生成式構造函數

class MyClass {
  MyClass(this.myString);
  final String myString;

  MyClass.fromJson(Map<String, dynamic> json) : this(json['myString']);
}

有兩種生成構造函數:命名的和未命名的。 MyClass.fromJson()是命名構造函數,而MyClass()是未命名構造函數。 以下原則適用於生成構造函數:

  • 生成式構造函數只能實例化 class 本身。
  • 生成式構造函數可以使用初始化列表。
  • 生成式構造函數只能使用初始化參數或初始化列表來設置final屬性,也就是說,不能在構造函數體中。
  • 生成式構造函數可以是const ,即使它們沒有重定向。

工廠建設者

class MyClass {
  MyClass(this.myString);
  final String myString;

  factory MyClass.fromJson(Map<String, dynamic> json) {
    return MyClass(json['myString']);
  }
}
  • 工廠構造函數可能返回 class 的子類型。
  • 工廠構造函數可用於創建單例。
  • 工廠構造函數可以像生成構造函數一樣不命名。
  • 工廠構造函數可以是const ,但僅限於重定向時。

Static方法

class MyClass {
  MyClass(this.myString);
  final String myString;

  static MyClass fromJson(Map<String, dynamic> json) {
    return MyClass(json['myString']);
  }
}
  • Static 方法可以返回任何東西,包括 Future。
  • Static 方法可用於創建單例。
  • Static 方法可用作撕下。

進一步閱讀

除了@suragch 的詳細答案。 我想給出一些要點,表明factory constructor是上述場景的最佳選擇(對於 fromJson() 方法)。

  • 使用工廠構造函數時,您不需要初始化該 class 的實例變量。 (但是當您使用生成構造函數時,需要初始化所有最終實例變量)

  • 工廠構造函數可以返回一個現有的 object。 例如:- 當使用 json_seriazible package 時,fromJson() 方法返回一個現有的(以前制作的)object。 所以我們只能使用帶有這個 package 的工廠構造函數。

  • 工廠構造函數可以返回 class 的任何子類型,但是當使用生成構造函數時,它只能返回 class 的確切類型 object。

  • 確保只創建一個 class 實例(單例模式)。 (對象很昂貴,因此 fromJson 應該需要 singleton 模式)

根據以上幾點,我們可以看到生成式構造函數為 fromJson 構造函數添加了更多限制,而 static 方法對 fromJson 的限制更少,因此它可能通過返回不同類型的對象而導致類型錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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