[英]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()
是未命名構造函數。 以下原則適用於生成構造函數:
final
屬性,也就是說,不能在構造函數體中。const
,即使它們沒有重定向。class MyClass {
MyClass(this.myString);
final String myString;
factory MyClass.fromJson(Map<String, dynamic> json) {
return MyClass(json['myString']);
}
}
const
,但僅限於重定向時。class MyClass {
MyClass(this.myString);
final String myString;
static MyClass fromJson(Map<String, dynamic> json) {
return MyClass(json['myString']);
}
}
除了@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.