Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart 为什么单例模式从来没有显示为带有const构造函数的类?_Dart_Singleton - Fatal编程技术网

Dart 为什么单例模式从来没有显示为带有const构造函数的类?

Dart 为什么单例模式从来没有显示为带有const构造函数的类?,dart,singleton,Dart,Singleton,这是一种确保我们只创建一个类实例的模式 大多数情况下,单例模式显示为: class Settings { static final Settings _instance = Settings._internal(); factory Settings() { return _instance; } Settings._internal() {} } 缺点:难以测试,违反单一责任 那么: class Singleton{

这是一种确保我们只创建一个类实例的模式

大多数情况下,单例模式显示为:

 class Settings {
      static final Settings _instance = Settings._internal();
      factory Settings() {
        return _instance;
      }
      Settings._internal() {}
    }
缺点:难以测试,违反单一责任

那么:

class Singleton{
   const Singleton();
}


Singleton s1=  const Singleton();
Singleton s2=  const Singleton();

  void main() {
    print(s1==s2); //true
}
易于测试。对象只有一个1责任


我的问题是,为什么人们会让生活变得更加困难,并且从不使用const构造函数实现单例。我遗漏了什么吗?

除了Christopher Moore关于
常量的评论之外,不可变的单例不太可能有用,非
工厂
常量
构造函数不能保证单个实例,这将违反单例模式。调用方需要在
const
上下文中显式调用构造函数:

class-Foo{
const Foo();
}
void main()异步{
常量foo1=Foo();
常量foo2=Foo();
var foo3=Foo();
print(foo1==foo2);//Prints:true
打印(foo1==foo3);//打印:false
}

相比之下,
工厂
构造函数可以保证只创建一个实例,而不会给调用方带来额外负担。

除了Christopher Moore关于
常量
的评论之外,不可变单例不太可能有用,非
工厂
常量
构造函数不保证单个实例,这将违反单例模式。调用方需要在
const
上下文中显式调用构造函数:

class-Foo{
const Foo();
}
void main()异步{
常量foo1=Foo();
常量foo2=Foo();
var foo3=Foo();
print(foo1==foo2);//Prints:true
打印(foo1==foo3);//打印:false
}

相比之下,
工厂
构造函数可以保证只创建一个实例,而不会给调用方带来额外负担。

因为像您展示的那样的单实例是非常无用的。您不能更改任何字段。首先,你为什么需要一个“单例”呢?你能详细说明一下你展示的常量单例的用途吗?也许它可以取代大多数人使用singleton的功能?要使用常量构造函数创建编译时常量,请将const关键字放在构造函数名称之前。构造两个相同的编译时常量将生成一个规范的实例是
const
的全部目的。顺便说一句,没有人尝试对常量使用单例模式。人们使用单例模式作为获取句柄的方法,该句柄允许在应用程序的不同作用域中访问相同的数据。您将展示一个没有字段的单例实现,它与您所建议的
const
构造函数一样有用。但是大多数人不使用没有非final字段的单例,因此不能将其视为替代项,因为像您显示的单例是非常无用的。您不能更改任何字段。首先,你为什么需要一个“单例”呢?你能详细说明一下你展示的常量单例的用途吗?也许它可以取代大多数人使用singleton的功能?要使用常量构造函数创建编译时常量,请将const关键字放在构造函数名称之前。构造两个相同的编译时常量将生成一个规范的实例是
const
的全部目的。顺便说一句,没有人尝试对常量使用单例模式。人们使用单例模式作为获取句柄的方法,该句柄允许在应用程序的不同作用域中访问相同的数据。您将展示一个没有字段的单例实现,它与您所建议的
const
构造函数一样有用。但是大多数人不使用没有非final字段的singleton,因此不能将其视为替代。