首页 > 解决方案 > Dart 命名构造函数、静态方法和工厂构造函数

问题描述

给定以下代码:

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

final myObject = MyClass.fromJson(jsonMap);

有多少种方法可以使用这种语法创建一个新对象:

MyClass.fromJson(jsonMap)

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

标签: dartconstructorstatic-methods

解决方案


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

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()未命名构造函数。以下原则适用于生成构造函数:

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

工厂建设者

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

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

静态方法

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

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

进一步阅读


推荐阅读