Dart中ClassA._();是否为构造函数?私有构造及单例相关问题咨询
Dart 私有构造函数与单例实现问题解答
ClassA._();的作用与调用规则
这是Dart的命名私有构造函数,作用有两个:
- 覆盖默认的公开无参构造函数,禁止外部直接通过
ClassA()创建类的实例 - 下划线开头的命名在Dart中属于库级私有,只有当前.dart文件内的代码可以调用这个构造函数,其他文件完全无法访问,也不能主动调用生成实例。
你当前贴的代码还没有完成单例逻辑,仅实现了「禁止外部随意实例化」的效果。
基于该写法的单例实例化时机
要实现完整的单例,通常会补充一个静态实例存储字段,标准写法如下:
class ClassA { ClassA._(); // 存储单例实例的静态字段 static final ClassA instance = ClassA._(); static final List<String> someList = ["A", "B", "C"]; }
Dart中所有静态变量默认都是懒加载的:只有你第一次访问ClassA.instance的时候,才会触发ClassA._()构造执行,完成实例化。在你第一次访问这个静态实例之前,不会占用资源生成实例。
实例化前自定义修改的实现方案
完全可以实现,根据你的逻辑是否为异步,有两种常用实现方式:
同步修改逻辑
直接把自定义逻辑写在私有构造函数内部即可,构造函数的执行逻辑会在实例生成完成、返回给调用方之前跑完:
class ClassA { ClassA._() { // 此处写自定义修改逻辑,比如修改静态列表、初始化实例属性都可以 someList.add("D"); } static final ClassA instance = ClassA._(); static final List<String> someList = ["A", "B", "C"]; }
异步修改逻辑
如果你的自定义逻辑需要异步操作(比如读本地存储、拉取远端配置),可以改成异步获取实例的实现:
class ClassA { ClassA._(); static ClassA? _instance; static final List<String> someList = ["A", "B", "C"]; static Future<ClassA> getInstance() async { if (_instance == null) { // 先执行异步自定义逻辑 await Future.delayed(const Duration(seconds: 1)); // 示例异步操作 someList.add("E"); // 自定义逻辑执行完成后再实例化 _instance = ClassA._(); } return _instance!; } }
注意:你代码中定义的
static final List<String> someList的final仅限制变量的引用不能修改,列表的内容是可以增删改的,如果需要完全不可修改的列表,可声明为static final List<String> someList = const List.unmodifiable(["A", "B", "C"]);
内容的提问来源于stack exchange,提问作者Mike Yinger
相关产品推荐
相关产品推荐

