Dart中工厂构造函数返回的实例为何需要声明为static静态字段?
为什么Dart工厂构造函数返回的单例实例需要加static修饰符
你提供的报错代码如下:
class DBHelper{ DBHelper._(); factory DBHelper()=>instance; // 此处编译报错 DBHelper instance=DBHelper._(); int number=2; int fun()=>number; }
报错核心原因
Dart的类成员分为两类,访问规则完全不同:
- 实例成员:没有加
static修饰的属性、方法,属于类的实例对象,必须先实例化类得到实例对象,才能通过实例访问 - 静态成员:加了
static修饰的属性、方法,属于类本身,不需要创建实例,直接通过类名就能访问
你代码里的instance没有加static,属于实例成员:要访问instance必须先有一个DBHelper的实例;但工厂构造函数的作用本身就是创建DBHelper实例,执行构造函数时还没有任何实例存在,根本无法访问到instance属性,形成了“要创建实例需要先访问实例成员,要访问实例成员需要先有实例”的死循环,编译器会直接报错。
加static修饰的合理性
- 解决访问依赖问题:
static修饰的instance属于DBHelper类本身,工厂构造函数执行时不需要先有实例就能直接访问该属性,规避了循环依赖 - 符合单例设计要求:静态属性在程序的全生命周期内只会初始化一次,天然满足单例模式全局唯一实例的要求,不会重复创建新的
DBHelper对象
修正后的正确单例实现:
class DBHelper{ DBHelper._(); // 私有命名构造函数,禁止外部直接实例化 static final DBHelper instance = DBHelper._(); // 静态全局唯一实例 factory DBHelper()=>instance; // 工厂构造函数返回静态实例 int number=2; int fun()=>number; }
内容的提问来源于stack exchange,提问作者Mariam Albarghouti
相关产品推荐
相关产品推荐

