我一直在调查我的Flutter应用程序的JSON解析,并且有一个关于我无法解决的工厂构造函数的问题.我试图理解使用工厂构造函数和普通构造函数的优点.例如,我看到很多JSON解析示例创建了一个带有JSON构造函数的模型类,如下所示:
class Student{
String studentId;
String studentName;
int studentScores;
Student({
this.studentId,
this.studentName,
this.studentScores
});
factory Student.fromJson(Map<String, dynamic> parsedJson){
return Student(
studentId: parsedJson['id'],
studentName : parsedJson['name'],
studentScores : parsedJson ['score']
);
}
}
Run Code Online (Sandbox Code Playgroud)
我也看到过相同数量的例子,它们并没有将构造函数声明为工厂.两种类型的classname.fromJSON构造函数都是从JSON数据创建一个对象,因此将构造函数声明为工厂还是在这里使用工厂是多余的?
我对这里提到的工厂构造函数示例有些疑问(https://www.dartlang.org/guides/language/language-tour#factory-constructors)。我知道在基本级别上只有三种类型的构造函数-默认,命名和参数化。
我试图真正了解来自 API 的 JSON 数据流,直到我可以将其作为对象使用。
现在我想我已经准备好了一切,我唯一的问题是为什么我看到有些人在使用命名构造函数 .fromJson 时使用工厂。根据 Dart 文档:
当我们实现一个并不总是创建类的新实例的构造函数时,我们使用 factory 关键字。
但是在这种情况下,我们总是会在使用 fromJson 时创建一个实例,对吗?
那么为什么有些人使用:
factory User.fromJson(Map<String, dynamic> json) =>
User(name: json['name'], alias: json['alias']);
Run Code Online (Sandbox Code Playgroud)
而不是更合理的:
User.fromJson(Map<String, dynamic> json)
: name = json['name'],
alias = json['alias'];
Run Code Online (Sandbox Code Playgroud)
非常感谢您的任何声明。
在构造器的Dart 语言之旅中,它给出了一个生成式构造器的示例:
class Point {
double x, y;
Point(double x, double y) {
// There's a better way to do this, stay tuned.
this.x = x;
this.y = y;
}
}
Run Code Online (Sandbox Code Playgroud)
后来它给出了一个命名构造函数的例子:
class Point {
double x, y;
Point(this.x, this.y);
// Named constructor
Point.origin() {
x = 0;
y = 0;
}
}
Run Code Online (Sandbox Code Playgroud)
这让我相信,当构造函数使用与类相同的名称时,它是一个生成构造函数:
Point(this.x, this.y);
Run Code Online (Sandbox Code Playgroud)
但是当有一个额外的标识符时,它就是一个命名构造函数:
Point.origin() {
x = 0;
y = 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,在我的另一个答案中,Dart 专家将我的“命名构造函数”更改为“生成构造函数”。这让我意识到我可能误解了它们之间的区别。命名构造函数是生成构造函数的子集吗?如果是这样,我如何调用只有类名而没有附加附加标识符的构造函数?
术语“命名构造函数”似乎不在语言规范中。