繁体   English   中英

Dart 命名构造函数、static 方法和工厂构造函数

[英]Dart named constructor, static method, and factory constructor

给定以下代码:

const jsonString = '{"myString":"Hello"}';
final jsonMap = jsonDecode(jsonString);

final myObject = MyClass.fromJson(jsonMap);

使用以下语法创建新的 object 有多少种方法:

MyClass.fromJson(jsonMap)

最近,我一直在尝试了解命名构造函数、工厂构造函数和 static 方法之间的区别,所以我在下面发布我的答案,以便将来有一些东西可以作为参考。

使用以下语法创建 object 的新实例:

MyClass.fromJson(jsonMap)

与以下代码一起使用:

// import 'dart:convert';

const jsonString = '{"myString":"Hello"}';
final jsonMap = jsonDecode(jsonString);

final myObject = MyClass.fromJson(jsonMap);

至少有以下几种方法(附有关于每种特征的补充说明):

生成式构造函数

class MyClass {
  MyClass(this.myString);
  final String myString;

  MyClass.fromJson(Map<String, dynamic> json) : this(json['myString']);
}

有两种生成构造函数:命名的和未命名的。 MyClass.fromJson()是命名构造函数,而MyClass()是未命名构造函数。 以下原则适用于生成构造函数:

  • 生成式构造函数只能实例化 class 本身。
  • 生成式构造函数可以使用初始化列表。
  • 生成式构造函数只能使用初始化参数或初始化列表来设置final属性,也就是说,不能在构造函数体中。
  • 生成式构造函数可以是const ,即使它们没有重定向。

工厂建设者

class MyClass {
  MyClass(this.myString);
  final String myString;

  factory MyClass.fromJson(Map<String, dynamic> json) {
    return MyClass(json['myString']);
  }
}
  • 工厂构造函数可能返回 class 的子类型。
  • 工厂构造函数可用于创建单例。
  • 工厂构造函数可以像生成构造函数一样不命名。
  • 工厂构造函数可以是const ,但仅限于重定向时。

Static方法

class MyClass {
  MyClass(this.myString);
  final String myString;

  static MyClass fromJson(Map<String, dynamic> json) {
    return MyClass(json['myString']);
  }
}
  • Static 方法可以返回任何东西,包括 Future。
  • Static 方法可用于创建单例。
  • Static 方法可用作撕下。

进一步阅读

除了@suragch 的详细答案。 我想给出一些要点,表明factory constructor是上述场景的最佳选择(对于 fromJson() 方法)。

  • 使用工厂构造函数时,您不需要初始化该 class 的实例变量。 (但是当您使用生成构造函数时,需要初始化所有最终实例变量)

  • 工厂构造函数可以返回一个现有的 object。 例如:- 当使用 json_seriazible package 时,fromJson() 方法返回一个现有的(以前制作的)object。 所以我们只能使用带有这个 package 的工厂构造函数。

  • 工厂构造函数可以返回 class 的任何子类型,但是当使用生成构造函数时,它只能返回 class 的确切类型 object。

  • 确保只创建一个 class 实例(单例模式)。 (对象很昂贵,因此 fromJson 应该需要 singleton 模式)

根据以上几点,我们可以看到生成式构造函数为 fromJson 构造函数添加了更多限制,而 static 方法对 fromJson 的限制更少,因此它可能通过返回不同类型的对象而导致类型错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM