dart 中 json 映射的工厂和命名构造函数

Factory and named constructor for json mapping in dart

考虑这段代码

class Album {
  int userId;
  int id;
  String title;

  Album({this.userId, this.id, this.title});

  Album.fromJsonN(Map<String, dynamic> json) {
    this.userId = json['userId'];
    this.id = json['id'];
    this.title = json['title'];
  }
  factory Album.fromJson(Map<String, dynamic> json) {
    return Album(userId: json['userId'], id: json['id'], title: json['title']);
  }
}

在大多数教程中,我们对 json 映射方法使用工厂的原因的解释是:“我们在实现并不总是创建其 [=18= 的新实例的构造函数时使用 factory 关键字]".

上面代码中的工厂方法,不是返回了一个新的实例吗?如果是这样,那么在这里使用工厂的原因是什么? 在这种情况下,工厂构造函数和 fromJsonN 命名构造函数之间有什么区别?

A Dart class may have generative constructors or factory constructors. A generative constructor is a function that always returns a new instance of the class. Because of this, it does not utilize the return keyword.

A factory constructor has looser constraints than a generative constructor. The factory need only return an instance that is the same type as the class or that implements its methods (ie satisfies its interface). This could be a new instance of the class, but could also be an existing instance of the class or a new/existing instance of a subclass (which will necessarily have the same methods as the parent). A factory can use control flow to determine what object to return, and must utilize the return keyword. In order for a factory to return a new class instance, it must first call a generative constructor.

另请参阅 以获得非常详细的解释。

所以对于你的问题:是的,它正在返回一个新的实例,但我想它的特殊性来自于这样一个事实,即你的工厂构造函数能够根据传入的 json 映射创建一个对象,而生成构造函数用于从单个属性实例化新对象。

关于你的最后一个问题:两者做同样的事情,即在给定 json 映射的情况下返回 class 的实例。技术上的区别是一个是生成器,一个是工厂构造器。

使用工厂构造函数或命名构造函数的用例之一。 要初始化 class 的最终字段,您必须在初始化列表中或在使用命名构造函数时在声明中进行。另一方面,使用工厂构造函数您可以在构造函数的主体中初始化最终字段。