为什么必须在类中调用_internal()?

Dam*_*les 2 dart

尽管我很熟悉单例,但 Dart 的工厂还是令人困惑。我看到了一个现有的问题,但我从答案中得到的唯一信息是该名称可以是以 _ 开头的任何标识符。尽管这个人问了为什么应该这样称呼它,但答案似乎并没有解释这一点。

如果我注释掉该Dog._internal();行,我会得到Method not found: 'Dog._internal'.它看起来像调用一个方法,但它像 C 的函数原型吗?但它没有返回类型。有人可以Dog._internal();向我解释一下这条线吗?

class Dog
{
  static final Dog dog = Dog._internal();
  //Dog._internal();
  factory Dog()
  {
    return dog;
  }
}
Run Code Online (Sandbox Code Playgroud)

jul*_*101 6

有多个概念,所以让我们看一下这个例子:

  factory Dog()
  {
    return dog;
  }
Run Code Online (Sandbox Code Playgroud)

这定义了一个工厂构造函数。工厂构造函数与普通静态方法非常相似,但必须始终返回与工厂构造函数所属类型兼容的对象。在我们的示例中,工厂构造函数必须返回一个Dog对象。

当我们进入此方法时,我们已经创建了一个对象,因此它不是一个构造函数。同样,它可以与默认构造函数进行比较static Dog Dog(),但允许覆盖默认构造函数。所以我们必须手动创建对象并返回它。

这使我们能够控制创建对象时的行为,并且在我们的例子中允许我们拥有单例模式,因此当有人尝试创建对象的实例时,Dog他们将始终获得相同的对象。

  Dog._internal();
Run Code Online (Sandbox Code Playgroud)

这称为命名构造函数。Dart 中的构造函数可以有给定的名称,这样可以更容易地区分不同的构造函数。而且还因为 Dart 不允许我们重写具有不同数量参数的方法。

此外,由于名称以_它开头,意味着该构造函数被标记为私有,并且不能在它所属的库之外使用。因此,如果您的代码是库的一部分,则导入库的代码不允许调用您的私有构造函数。

这又是一个漂亮的技巧,允许我们创建一个单例,因为我们不希望除了我们自己的代码之外创建一个新实例(这是我们想要创建的唯一实例)。

  static final Dog dog = Dog._internal();
Run Code Online (Sandbox Code Playgroud)

这对于创建单例至关重要。原因是staticDart 中的变量是惰性计算的,因此该值dog在调用之前实际上没有任何值。第一次调用后,该值将被“缓存”,因此Dog._internal(7)只要我们的应用程序(或更具体地说,我们的 isoleate 实例)正在运行,该值就会被调用一次。

我会正确地调用该变量_instance,否则_dog它也是私有的。