单例在 Dart 中是如何工作的?

How singleton works in Dart?

我是 Dart 和 Flutter 的新手。在学习教程时,我了解到我们可以使用 factory 关键字创建单例。但是在那之后,我得到了这个代码。

class AccountService {
  static final _instance = AccountService._internal();

  AccountService._internal();

  static AccountService getInstance() {
    return _instance;
  }
}

我的问题。

  1. 代码如何工作?
  2. 何时 getInstance() 接到电话?
  3. AccountService._internal()是构造函数吗?
  4. static final _instance = AccountService._internal(); - 什么时候调用?

请帮帮我

Dart 中的静态字段都是延迟求值的,因此它们将在您第一次访问该字段时首先获取其值。

所以:

  1. 当您调用getInstance()时,它将return字段的值_instance。如果这是第一次评估该字段,则调用 AccountService._internal()。如果是第二次,则重复使用之前访问的值。

  2. 您是第一次在代码中的某处调用该方法吗?如果您从不调用该方法,则永远不会创建 _instance 引用的对象。

  3. 是的,它是一个命名构造函数,因为名称以“_”开头,所以它只能从 class 所属的库中获得。通过这样做,可以限制来自此 class 的新对象,因此只允许 class 本身创建实例。

  4. 第一次访问时调用_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