dart工厂构造函数标识符的优点

mjo*_*dan 16 dart flutter

我一直在调查我的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数据创建一个对象,因此将构造函数声明为工厂还是在这里使用工厂是多余的?

Gün*_*uer 20

普通构造函数始终返回当前类的新实例(构造函数抛出异常时除外).

工厂构造函数与静态方法非常相似,但与之不同

  • 只能返回当前类或其子类之一的实例
  • 可以调用,new但现在new变得不那么相关,因为它是可选的.
  • 没有初始化列表(没有: super())

因此可以使用工厂构造函数

  • 创建子类的实例(例如,取决于传递的参数
  • 返回缓存的实例而不是新的实例
  • 准备计算值以将它们作为参数转发给普通构造函数,以便可以使用它们初始化最终字段.这通常用于解决在普通构造函数的初始化程序列表中可以执行的操作的限制(如错误处理).

在您的示例中此代码

  studentId: parsedJson['id'],
  studentName : parsedJson['name'],
  studentScores : parsedJson ['score']
Run Code Online (Sandbox Code Playgroud)

可以移动到普通构造函数的主体,因为不需要final初始化任何字段.

  • 但是,您不能像使用回调一样将其用作变量。但是,是的,使用飞镖2,增益是有限的 (4认同)
  • 也许提到子类不能`super.factory`? (3认同)
  • 我认为工厂构造函数的主要目的是隐藏一个事实,即它是一个静态函数,作为实现细节。提供一致的实例化方法 (2认同)
  • 谢谢你的回复,冈特。似乎使用工厂构造函数与命名构造函数相比具有有效的特殊情况用途,但不应随意使用。我看到的大多数示例仅使用命名构造函数就可以充分解决,但使用的是工厂构造函数。在我在我的问题中使用的示例中,正确的实现似乎是这样的:`Student.fromJson(Map&lt;String, dynamic&gt; parsedJson) : studentId = parsedJson['id'], studentName = parsedJson['name'], studentScores = parsedJson['score'];` (2认同)

jam*_*lin 8

工厂构造函数与普通构造函数

  • 工厂构造函数调用另一个构造函数。
  • 由于工厂构造函数不会直接创建新实例,因此无法使用构造函数初始化列表。
  • 普通的构造函数总是返回该类的新实例。允许工厂构造函数返回现有实例,派生类的实例或null。(但是,有些人不喜欢null从工厂构造函数中返回。)

工厂构造函数与静态方法

  • 工厂构造函数可以是类的未命名的默认构造函数。
  • 工厂构造函数可与一起使用new。(但使用new现在气馁。)
  • 静态方法可用于创建剥离(即,它们可用作回调),但构造函数当前不能
  • 静态方法可以async。(工厂构造函数必须返回其类的类型,因此它不能返回Future。)
  • 在生成的dartdoc文档中,工厂构造函数显然将在“构造函数”部分(位于顶部)中列出,而静态方法将在“静态方法”部分(当前位于底部)中列出。

  • 这并不能真正回答问题。您分别解释了工厂构造函数与普通构造函数以及静态方法之间的区别。相反,问题是为什么在解析 json 时使用工厂构造函数,在官方示例中给出的新实例总是在工厂构造函数中创建。 (3认同)
  • @iKeepChangingName 没关系,但我仍然认为答案实际上并没有回答问题,而是对工厂构造函数是什么和不是什么进行了很好的总结。他在 Google 的 Dart 工作这一事实也没有改变我的观点。不用担心我们对此有不同意见:) (3认同)