factory帮我们做了什么?
来源:10-7 Json转换成对象

demonCry
2022-09-08
class VideoModel {
String title = '';
String url = '';
int playCount = 0;
VideoModel(this.title, this.url, this.playCount);
factory VideoModel.fromJSon(Map<String,dynamic> json) => VideoModel(json['title'], json['url'], json['playCount']);
}
factory这个关键字具体帮我们做了什么呢? 感觉直接写个叫做fromJSON的静态方法也是一样的效果?
写回答
1回答
-
马超老师
2022-09-09
这个地方把Factory换成Static method确实是完全一样的。
其实大多数场景下这两者是一样的,这里总结了5种常见情况,是factory可以实现而static method实现不了的:
1、和Java一样,Dart中一个类如果没有写构造器,则会自动创建一个无参默认构造器。但是如果有一个factory构造器,那么编译期就不会创建默认构造器了,但是static method不会有这个效果;
2、factory构造器可以省略函数名。如果类中没有定义匿名构造器,则可以直接用类名来定义factory;
3、可以忽略泛型参数。假如class都声明中有泛型参数,那在static method中返回值也要填上完整的类名+泛型参数,但是如果是factory就可以直接用类名,这个在泛型参数很长的时候比较适用;
4、factory可以声明成const;
5、构造器重定向可以省略参数。当Dart类中有多个构造器都时候,经常会做构造器都重定向(构造器A调用构造器B),这时候如果用static method,就需要把所有的参数都传给目标构造器。而factory中重定向构造器只需要写函数名,编译期会自动帮我们传递参数,这个算是一个语法糖。
整体来讲,绝大多数场景下可以static method和factory可以互换,factory更像是一种语法糖,在一些特定场景下可以帮助我们省略一些代码。
20
相似问题