繁体   English   中英

dart 中 json 映射的工厂和命名构造函数

[英]Factory and named constructor for json mapping in dart

考虑这个代码

class Album {
  int userId;
  int id;
  String title;

  Album({this.userId, this.id, this.title});

  Album.fromJsonN(Map<String, dynamic> json) {
    this.userId = json['userId'];
    this.id = json['id'];
    this.title = json['title'];
  }
  factory Album.fromJson(Map<String, dynamic> json) {
    return Album(userId: json['userId'], id: json['id'], title: json['title']);
  }
}

在大多数教程中,我们对 json 映射方法使用工厂的原因的解释是:“我们在实现不总是创建其类的新实例的构造函数时使用 factory 关键字”。

在上面代码的工厂方法中,它不是返回一个新实例吗? 如果是这样,那么在这里使用工厂的原因是什么? 在这种情况下,工厂构造函数和 fromJsonN 命名构造函数之间有什么区别?

Dart 类可能具有生成构造函数或工厂构造函数。 生成构造函数是一个总是返回类的新实例的函数。 因此,它不使用 return 关键字。

工厂构造函数比生成构造函数具有更宽松的约束。 工厂只需要返回与类相同类型或实现其方法(即满足其接口)的实例。 这可能是类的新实例,但也可能是类的现有实例或子类的新/现有实例(必须与父类具有相同的方法)。 工厂可以使用控制流来确定要返回的对象,并且必须使用 return 关键字。 为了让工厂返回一个新的类实例,它必须首先调用一个生成构造函数。

另请参阅了解工厂构造函数代码示例 - Dart以获得非常详细的解释。

所以对于你的问题:是的,它正在返回一个新的实例,但我想专业来自这样一个事实,即工厂构造函数能够基于传入的 json 映射创建一个对象,而生成构造函数用于实例化一个新对象。单一属性。

对于您的最后一个问题:两者都做同样的事情,即在给定 json 映射的情况下返回类的实例。 技术上的区别在于,一个是生成器,一个是工厂构造函数。

何时使用工厂构造函数或命名构造函数的用例之一。 要初始化类的最终字段,您必须在初始化列表或使用命名构造函数时的声明中进行。 另一方面,使用工厂构造函数您可以初始化构造函数主体中的最终字段。

暂无
暂无

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

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