Flutter中Factory fromJson与构造函数fromJson的适用场景区别
Flutter中
factory fromJson与命名构造函数fromJson的差异及场景选择 首先要纠正一个常见认知偏差:所谓“单实例用factory、多实例用命名构造”的规则并不完全准确,factory的核心特性不是只能返回单例,而是可以灵活控制返回的实例对象,无需每次调用都生成全新实例;而命名构造函数每次调用必然生成完全独立的新实例。
核心差异
- 命名构造函数
fromJson:逻辑固定,输入对应参数后直接返回全新的类实例,没有额外的逻辑控制空间。 factory fromJson:本质是带构造函数使用体验的工厂方法,内部可插入自定义逻辑:可以返回已缓存的旧实例、可以返回对应子类的实例、可以做异常兜底返回默认实例,空安全场景下甚至可以返回null。
适用场景划分
优先选factory fromJson的场景
- 反序列化需要多态分发:比如同一个JSON结构对应多个子类(例如API返回的内容列表包含文本、图片、视频三种类型,可在基类的
factory fromJson中判断type字段,直接返回对应子类的实例) - 需要做实例缓存:比如同一个ID的用户信息反序列化时,直接返回已创建过的实例,减少内存占用和重复初始化开销
- 需要做异常容错:比如JSON字段缺失/类型不匹配时,不直接抛异常崩溃,而是返回预设的默认实例
- 全局单例类的反序列化:比如全局配置类仅需一个实例,反序列化后全局复用
优先选命名构造函数fromJson的场景
- 模型逻辑简单,不需要任何自定义实例控制逻辑,每次反序列化都要求生成独立的新实例(比如普通的列表项数据,每个条目互不关联,修改其中一个不能影响其他条目)
- 模型为不可变类,需要配合
copyWith做状态更新,要求每个实例完全独立
API响应模型选型建议
绝大多数普通业务场景的API响应模型,直接使用命名构造函数fromJson就完全够用,不需要强行使用factory。只有当你遇到上述需要自定义控制返回实例的场景时,再切换为factory即可。
如果你使用json_serializable这类代码生成工具,默认生成的就是命名构造函数fromJson,需要factory实现时才要单独加配置,也侧面验证了普通场景下命名构造函数的适用性。
内容的提问来源于stack exchange,提问作者dontknowhy
相关产品推荐
相关产品推荐

