单身人士如何在 Dart 中工作?

c49*_*c49 0 singleton dart

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

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

  AccountService._internal();

  static AccountService getInstance() {
    return _instance;
  }
}
Run Code Online (Sandbox Code Playgroud)

我的问题。

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

请帮我

jul*_*101 5

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

所以:

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

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

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

  4. 它被称为第一次_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)