为什么在这种情况下使用工厂构造函数

时间:2019-05-15 02:48:39

标签: dart flutter

我在this article中遇到了一个有用的Parsing Complex JSON工具。 The tool将以JSON示例为例,并以您选择的编程语言对其进行解析。

我目前正在使用Dart,并使用我的简单原始JSON“内容”示例:

{
  "title": "Welcome to quicktype!"
}

被此JSON tool in Dart解析后,将创建以下Dart类:

import 'dart:convert';

Content contentFromJson(String str) => Content.fromJson(json.decode(str));

String contentToJson(Content data) => json.encode(data.toJson());

class Content {
    String title;

    Content({
        this.title,
    });

    factory Content.fromJson(Map<String, dynamic> json) => new Content(
        title: json["title"],
    );

    Map<String, dynamic> toJson() => {
        "title": title,
    };
}

在这种情况下,工厂构造函数的目的是什么?没有存储Content类实例的“私有”变量。没有检查缓存或键,以便在使用相同的原始JSON数据参数的后续Content.fromJson调用中返回已实例化的Content类。

因为使用了factory关键字,这是否意味着Dart仅仅因为该方法被表示为Factory构造函数就可以处理在后台重用相同的实例化?

1 个答案:

答案 0 :(得分:1)

在该示例中,我看不到需要使用factory。可能是一个普通的命名构造函数:

Content.fromJson(Map<String, dynamic> json) : this(title: json["title"]);

也就是说,即使没有必要,factory仍然有用的原因有几个:

  • 这有可能使某天它可能返回一个现有实例而不是保证一个新实例。

  • 如果在Content.fromJson中添加了任何错误检查代码,则可能需要构造函数主体,并且可能不再能够委托给主构造函数。 factory构造函数不使用初始化列表,因此没有该限制。

当然,在这种情况下,factory构造函数也是不必要的,因为它也可以是static方法(which could provide other benefits)。