dart - Singleton在Dart中如何工作?

标签 dart singleton

我是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()时,它将返回_instance字段的值。如果这是第一次,则将评估该字段,因此将调用AccountService._internal()。如果是第二次,则先前访问的值将被重用。
  • 第一次在代码中的某个地方调用该方法?如果您从不调用该方法,则将永远不会创建_instance引用的对象。
  • 是的,它是一个命名的构造函数,并且由于名称以“_”开头,因此只能从该类所属的库中使用。这样,可以限制此类中的新对象,以便仅允许类本身创建实例。
  • 首次访问_instance时被称为。由于此名称也以“_”开头,因此只能从该类所属的库中使用。

  • 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 - Singleton在Dart中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62358679/

    相关文章:

    flutter - 如何在 flutter 中显示 scrollController 的滚动索引?

    c++ - C++ 单例类实例的堆/动态与静态内存分配

    c++ - 链接静态单例类

    objective-c - Objective-C 和 swift

    flutter - flutter-在iOS中忽略了showDialog的barrierDismissible吗?

    python - 如何在后台运行时使用flutter应用程序截屏

    flutter - FlutterWeb TextFormFields不接受输入

    flutter - 行和列对齐而不是填充抖动

    java - 集群中的单例与有状态远程 EJB 引用

    包含一组加载一次的数据的 Go 包