Dart 命名构造函数、静态方法和工厂构造函数

Sur*_*gch 4 constructor static-methods dart

给出以下代码:

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

final myObject = MyClass.fromJson(jsonMap);
Run Code Online (Sandbox Code Playgroud)

使用此语法有多少种方法创建新对象:

MyClass.fromJson(jsonMap)
Run Code Online (Sandbox Code Playgroud)

最近,我一直在尝试了解命名构造函数、工厂构造函数和静态方法之间的区别,因此我将我的答案发布在下面,以便我将来可以作为参考。

Sur*_*gch 5

使用以下语法创建对象的新实例:

MyClass.fromJson(jsonMap)
Run Code Online (Sandbox Code Playgroud)

与以下代码一起使用:

// import 'dart:convert';

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

final myObject = MyClass.fromJson(jsonMap);
Run Code Online (Sandbox Code Playgroud)

至少有以下几种方法可以做到这一点(并补充说明每种方法的特点):

生成构造函数

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

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

有两种生成构造函数:命名的和未命名的。是MyClass.fromJson()命名构造函数,而MyClass()是未命名构造函数。以下原则适用于生成构造函数:

  • 生成构造函数只能实例化类本身。
  • 生成构造函数可以使用初始值设定项列表。
  • 生成构造函数只能使用初始化参数或初始化列表来设置final属性,即不在构造函数主体中。
  • 生成构造函数可以是const,即使它们没有重定向。

工厂构造函数

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

  factory MyClass.fromJson(Map<String, dynamic> json) {
    return MyClass(json['myString']);
  }
}
Run Code Online (Sandbox Code Playgroud)
  • 工厂构造函数可以返回该类的子类型。
  • 工厂构造函数可用于创建单例。
  • 工厂构造函数可以像生成构造函数一样未命名。
  • 工厂构造函数可以const,但仅限于重定向时。

静态方法

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

  static MyClass fromJson(Map<String, dynamic> json) {
    return MyClass(json['myString']);
  }
}
Run Code Online (Sandbox Code Playgroud)
  • 静态方法可以返回任何内容,包括 Future。
  • 静态方法可用于创建单例。
  • 静态方法可以用作撕裂。

进一步阅读