Flutter Dart中类构造函数能否取消实例创建并返回已有对象?
可以实现该需求,Dart提供了工厂构造函数专门处理这类需要自定义实例返回逻辑的场景,普通生成式构造函数无法直接返回其他实例,修改你的代码如下即可正常运行:
class Users { // 把const改成final,否则无法修改Map内容 static final Map<String, User> users = {}; } class User { final String id; final String firstName; // 工厂构造函数,支持自定义返回实例 factory User({required String id, required String firstName}) { // 先检查缓存是否存在对应id的实例 if (Users.users.containsKey(id)) { return Users.users[id]!; } // 不存在则创建新实例,存入缓存后返回 final newUser = User._internal(id: id, firstName: firstName); Users.users[id] = newUser; return newUser; } // 私有的生成式构造函数,用来完成实际的实例初始化 User._internal({required this.id, required this.firstName}); }
关键改动说明
- 原代码中
Users.users定义为const Map,const修饰的集合是编译时常量,无法在运行时修改内容,改为static final Map即可正常读写缓存。 - 给User的构造函数添加
factory修饰符将其声明为工厂构造函数,这类构造函数不需要主动生成新实例,允许你自定义逻辑返回任意符合类型要求的已有/新建实例。 - 新增私有的命名构造函数
User._internal用来完成新实例的实际初始化工作,final修饰的实例属性可以直接在这类生成式构造函数的参数列表中完成赋值。
效果验证
void main() { final user1 = User(id: "001", firstName: "张三"); final user2 = User(id: "001", firstName: "李四"); print(identical(user1, user2)); // 输出true,说明两次调用返回的是同一个实例 print(user1.firstName); // 输出张三,缓存的实例不会被后续调用的参数覆盖 }
内容的提问来源于stack exchange,提问作者Vingtoft
相关产品推荐
相关产品推荐

