当前位置: 首页 > 知识库问答 >
问题:

singleton在Dart中如何工作?

王辉
2023-03-14

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

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

  AccountService._internal();

  static AccountService getInstance() {
    return _instance;
  }
}

我的问题。

  1. 代码是如何工作的
  2. 何时调用<code>getInstance()
  3. AccountService_internal()是构造函数吗
  4. 静态final_instance=AccountService_内部() -何时调用

请帮助我


共有1个答案

闻人献
2023-03-14
匿名用户

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

因此:

>

  • 当调用<code>getInstance()的值。如果这是第一次评估该字段,请使用AccountService_调用internal()。如果是第二次访问,则重用以前访问的值。

    第一次在代码中调用这个方法。如果从不调用该方法,则不会创建< code>_instance引用的对象。

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

    第一次访问_instance调用它。由于该名称也以“_”开头,因此只能从该类所属的库中使用。

    静态字段的延迟初始化在Dart规范中进行了描述,其推理如下:

    带有初始化表达式的静态变量声明是惰性初始化的(8.1)。

    之所以给出惰性语义,是因为我们不想要一种倾向于定义昂贵的初始化计算的语言,从而导致应用程序启动时间过长。这对于 Dart 尤其重要,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');
    }
    

    输出:

    :: Start
    :: Step 1
    :: Calling getInstance()
    :: Calling AccountService._internal constructor
    :: Step 2
    :: Calling getInstance()
    :: End
    

  •  类似资料:
    • 这可能是一个反复出现的问题,但我发现了相互矛盾的答案,现在我不知道哪一个是正确的。我以为我理解了这个概念,然后我开始阅读所有这些答案,我完全困惑了,所以我在寻找一个明确而简单的答案来回答我的问题,我很容易理解。 根据这个答案和这篇文章,应该中断代码执行,实际上等待未来完成,然后继续按顺序执行其余代码。它还表明这可能会阻塞主线程,这在这种情况下是合乎逻辑的。 另一方面,来自flutter团队的这个、

    • 我有服务器套接字,当我用java访问它时,设置socket.setsolinger(true,0);is工作得很好。我试图用dart实现java客户机代码,但我一直得到一个错误。此外,获取错误也需要时间。飞镖应该是快的! 在java中,我将套接字打开为socketOut=new DataOutPutStream(socket.getOutputStream());和socketIn=new Dat

    • 我是斯威夫特编程新手,请告诉我如何用代码在斯威夫特实现单例类。 在obj-c中我知道 斯威夫特怎么样

    • 单例模式确保只创建一个类的实例。我如何在飞镖中建立这个?

    • 因此,Dart API对==运算符这样说: 相等运算符。 所有对象的默认行为是,当且仅当此对象和其他对象是同一对象时,才返回true。 重写此方法以在类上指定不同的相等关系。重写方法仍然必须是等价关系。也就是说,它必须是: Total:它必须为所有参数返回一个布尔值。它不应该扔。 反身:对于所有对象 必须为。 对称:对于所有对象< code>o1和< code > O2 ,< code > O1

    • 为什么会有这个类 平常我们使用单例不外乎两种方式: 在对象里加个静态方法getInstance()来获取。此方式可以参考 【转】线程安全的单例模式 这篇博客,可分为饿汉和饱汉模式。 通过Spring这类容器统一管理对象,用的时候去对象池中拿。Spring也可以通过配置决定懒汉或者饿汉模式 说实话我更倾向于第二种,但是Spring更注重的是注入,而不是拿,于是我想做Singleton这个类,维护一个