尽管我对singleton很熟悉,但Dart的工厂令人困惑。我见过existing question,但我从答案中得到的唯一一点是,名称可以是以_开头的任何标识符。即使这个人问为什么它应该被称为,答案似乎并没有解释这一点。
如果我注解掉Dog._internal();
行,我得到Method not found: 'Dog._internal'.
它看起来像调用一个方法,但它像C的函数原型吗?但它没有返回类型。有人能给我解释一下Dog._internal();
线吗?
class Dog
{
static final Dog dog = Dog._internal();
//Dog._internal();
factory Dog()
{
return dog;
}
}
2条答案
按热度按时间oknwwptz1#
有多个概念,所以让我们通过这个例子:
这定义了一个工厂构造函数。工厂构造函数很像普通的静态方法,但必须总是返回一个与工厂构造函数所属类型兼容的对象。在我们的例子中,工厂构造函数必须返回一个
Dog
对象。它不是一个构造函数,因为当我们输入这个方法时,我们已经创建了一个对象。同样,它可以与
static Dog Dog()
进行比较,但允许重写默认构造函数。所以我们必须手动创建对象并返回它。这允许我们控制对象创建时的行为,在我们的例子中,允许我们有一个单例模式,所以当有人试图创建
Dog
的示例时,他们总是会得到相同的对象。这称为命名构造函数。Dart中的构造函数可以有给定的名称,这使得区分不同的构造函数变得更容易。但也因为Dart不允许我们用不同数量的参数覆盖方法。
此外,由于名称以
_
开头,这意味着该构造函数被标记为私有,不能在它所属的库之外使用。所以如果你的代码是一个库的一部分,那么导入你的库的代码就不允许调用你的私有构造函数。这又是一个允许我们创建单例的巧妙技巧,因为我们不希望除了我们自己的代码之外的其他代码创建新的示例(这是我们想要创建的唯一示例)。
这是创建单例的关键。这是因为Dart中的
static
变量是延迟计算的,因此dog
在被调用之前并没有任何值。在第一次调用之后,值被“缓存”,因此只要我们的应用程序(或者更具体地说,我们的isoleate示例)正在运行,Dog._internal(7)
就只被调用一次。我会正确地调用变量
_instance
或_dog
,因此它也是私有的。qgelzfjb2#
在类作用域中,
Dog._internal();
定义了一个名为_internal
的 named 构造函数,它不带参数,也没有主体。它相当于Dog._internal() {}
。如果构造函数接受参数并工作,这将更加明显,例如: