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 的最终字段,您必须在初始化列表中或在使用命名构造函数时在声明中进行。另一方面,使用工厂构造函数您可以在构造函数的主体中初始化最终字段。
考虑这段代码
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 的最终字段,您必须在初始化列表中或在使用命名构造函数时在声明中进行。另一方面,使用工厂构造函数您可以在构造函数的主体中初始化最终字段。