单例在 Dart 中是如何工作的?
How singleton works in Dart?
我是 Dart 和 Flutter 的新手。在学习教程时,我了解到我们可以使用 factory 关键字创建单例。但是在那之后,我得到了这个代码。
class AccountService {
static final _instance = AccountService._internal();
AccountService._internal();
static AccountService getInstance() {
return _instance;
}
}
我的问题。
- 代码如何工作?
- 何时
getInstance()
接到电话?
AccountService._internal()
是构造函数吗?
static final _instance = AccountService._internal();
- 什么时候调用?
请帮帮我
Dart 中的静态字段都是延迟求值的,因此它们将在您第一次访问该字段时首先获取其值。
所以:
当您调用getInstance()
时,它将return字段的值_instance
。如果这是第一次评估该字段,则调用 AccountService._internal()
。如果是第二次,则重复使用之前访问的值。
您是第一次在代码中的某处调用该方法吗?如果您从不调用该方法,则永远不会创建 _instance
引用的对象。
是的,它是一个命名构造函数,因为名称以“_”开头,所以它只能从 class 所属的库中获得。通过这样做,可以限制来自此 class 的新对象,因此只允许 class 本身创建实例。
第一次访问时调用_instance
。由于此名称也以“_”开头,因此只能从 class 所属的库中获得。
静态字段的延迟初始化在 Dart 规范中有如下描述:
Static variable declarations with an initializing expression are initializedlazily (8.1).
The lazy semantics are given because we do not want a language where one tends to define expensive initialization computations, causing long application startup times. This is especially crucial for Dart, which must support the coding of client applications.
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');
}
输出:
:: Start
:: Step 1
:: Calling getInstance()
:: Calling AccountService._internal constructor
:: Step 2
:: Calling getInstance()
:: End
我是 Dart 和 Flutter 的新手。在学习教程时,我了解到我们可以使用 factory 关键字创建单例。但是在那之后,我得到了这个代码。
class AccountService {
static final _instance = AccountService._internal();
AccountService._internal();
static AccountService getInstance() {
return _instance;
}
}
我的问题。
- 代码如何工作?
- 何时
getInstance()
接到电话? AccountService._internal()
是构造函数吗?static final _instance = AccountService._internal();
- 什么时候调用?
请帮帮我
Dart 中的静态字段都是延迟求值的,因此它们将在您第一次访问该字段时首先获取其值。
所以:
当您调用
getInstance()
时,它将return字段的值_instance
。如果这是第一次评估该字段,则调用AccountService._internal()
。如果是第二次,则重复使用之前访问的值。您是第一次在代码中的某处调用该方法吗?如果您从不调用该方法,则永远不会创建
_instance
引用的对象。是的,它是一个命名构造函数,因为名称以“_”开头,所以它只能从 class 所属的库中获得。通过这样做,可以限制来自此 class 的新对象,因此只允许 class 本身创建实例。
第一次访问时调用
_instance
。由于此名称也以“_”开头,因此只能从 class 所属的库中获得。
静态字段的延迟初始化在 Dart 规范中有如下描述:
Static variable declarations with an initializing expression are initializedlazily (8.1).
The lazy semantics are given because we do not want a language where one tends to define expensive initialization computations, causing long application startup times. This is especially crucial for Dart, which must support the coding of client applications.
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');
}
输出:
:: Start
:: Step 1
:: Calling getInstance()
:: Calling AccountService._internal constructor
:: Step 2
:: Calling getInstance()
:: End