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

d4so4syb  于 2023-09-28  发布在  其他
关注(0)|答案(2)|浏览(339)

尽管我对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;
  }
}
oknwwptz

oknwwptz1#

有多个概念,所以让我们通过这个例子:

factory Dog()
  {
    return dog;
  }

这定义了一个工厂构造函数。工厂构造函数很像普通的静态方法,但必须总是返回一个与工厂构造函数所属类型兼容的对象。在我们的例子中,工厂构造函数必须返回一个Dog对象。
它不是一个构造函数,因为当我们输入这个方法时,我们已经创建了一个对象。同样,它可以与static Dog Dog()进行比较,但允许重写默认构造函数。所以我们必须手动创建对象并返回它。
这允许我们控制对象创建时的行为,在我们的例子中,允许我们有一个单例模式,所以当有人试图创建Dog的示例时,他们总是会得到相同的对象。

Dog._internal();

这称为命名构造函数。Dart中的构造函数可以有给定的名称,这使得区分不同的构造函数变得更容易。但也因为Dart不允许我们用不同数量的参数覆盖方法。
此外,由于名称以_开头,这意味着该构造函数被标记为私有,不能在它所属的库之外使用。所以如果你的代码是一个库的一部分,那么导入你的库的代码就不允许调用你的私有构造函数。
这又是一个允许我们创建单例的巧妙技巧,因为我们不希望除了我们自己的代码之外的其他代码创建新的示例(这是我们想要创建的唯一示例)。

static final Dog dog = Dog._internal();

这是创建单例的关键。这是因为Dart中的static变量是延迟计算的,因此dog在被调用之前并没有任何值。在第一次调用之后,值被“缓存”,因此只要我们的应用程序(或者更具体地说,我们的isoleate示例)正在运行,Dog._internal(7)就只被调用一次。
我会正确地调用变量_instance_dog,因此它也是私有的。

qgelzfjb

qgelzfjb2#

在类作用域中,Dog._internal();定义了一个名为_internalnamed 构造函数,它不带参数,也没有主体。它相当于Dog._internal() {}。如果构造函数接受参数并工作,这将更加明显,例如:

class Dog {
  static final Dog dog = Dog._internal(7);

  Dog._internal(this.years) {
    registerAnimal(this);
  }

  factory Dog() {
    return dog;
  }

  int years;
}

相关问题