我是 Dart 和 Flutter 的新手。当我在学习教程时,我了解到我们可以使用 factory 关键字来制作单例。但在那之后,我得到了这个代码。
class AccountService {
static final _instance = AccountService._internal();
AccountService._internal();
static AccountService getInstance() {
return _instance;
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题。
getInstance()打电话?AccountService._internal()构造函数?static final _instance = AccountService._internal(); - 这什么时候被调用?请帮我
Dart 中的静态字段都是惰性求值的,因此它们将在您第一次访问该字段时首先获取其值。
所以:
当您调用时getInstance(),它将返回该字段的值_instance。如果这是第一次评估该字段,AccountService._internal()则调用该字段。如果是第二次,则重复使用上次访问的值。
第一次在代码中的某处调用该方法?如果您从不调用该方法,_instance则永远不会创建所引用的对象。
是的,它是一个命名构造函数,因为名称以“_”开头,因此只能从该类所属的库中获得。通过这样做,可以限制来自此类的新对象,以便仅允许类本身创建实例。
它被称为第一次_instance访问。由于此名称也以“_”开头,因此只能从该类所属的库中获得。
Dart 规范中描述了静态字段的延迟初始化,其推理如下:
带有初始化表达式的静态变量声明被延迟初始化 (8.1)。
给出惰性语义是因为我们不想要一种语言,在这种语言中,人们倾向于定义昂贵的初始化计算,从而导致应用程序启动时间过长。这对于 Dart 尤其重要,它必须支持客户端应用程序的编码。
https://dart.dev/guides/language/specifications/DartLangSpec-v2.2.pdf
添加代码示例
class AccountService {
static final _instance = AccountService._internal();
AccountService._internal() {
print(':: Calling AccountService._internal constructor');
}
static AccountService getInstance() {
print(':: Calling getInstance()');
return _instance;
}
}
void main() {
print(':: Step 1');
AccountService.getInstance();
print(':: Step 2');
AccountService.getInstance();
print(':: End');
}
Run Code Online (Sandbox Code Playgroud)
输出:
class AccountService {
static final _instance = AccountService._internal();
AccountService._internal() {
print(':: Calling AccountService._internal constructor');
}
static AccountService getInstance() {
print(':: Calling getInstance()');
return _instance;
}
}
void main() {
print(':: Step 1');
AccountService.getInstance();
print(':: Step 2');
AccountService.getInstance();
print(':: End');
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
143 次 |
| 最近记录: |