dart - Dart 命名构造函数、静态方法和工厂构造函数
问题描述
给定以下代码:
const jsonString = '{"myString":"Hello"}';
final jsonMap = jsonDecode(jsonString);
final myObject = MyClass.fromJson(jsonMap);
有多少种方法可以使用这种语法创建一个新对象:
MyClass.fromJson(jsonMap)
最近我一直在尝试理解命名构造函数、工厂构造函数和静态方法之间的区别,所以我在下面发布了我的答案,以便将来有一些东西可以作为参考。
解决方案
使用以下语法创建对象的新实例:
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。
- 静态方法可用于创建单例。
- 静态方法可以用作撕裂。
进一步阅读
推荐阅读
- c# - 如何从 ASP.NET MVC 中的单元测试中分配 BaseController 值
- automation - 如何修复此“使用带有 contextId 的 'CLASS_NAME' 查找'android.widget.TextView':''多个:false”
- typescript - lambda函数中警告中的阴影变量
- javascript - 将两个图像与 JavaScript 合并为水印
- amazon-web-services - 通过 CloudFormation 将函数动态附加到 AppSync Pipeline Resolver
- java - 将 Pojo 转换为 JSON
- php - PHP 插入 PostgreSQL
- sql - 使用带有自外键的递归
- javascript - 如何在电子应用程序中获取持久权限?
- c++ - 在#include 预处理器命令中使用 qmake 变量