是否有理由在静态方法上使用构造函数? (Future.delayed,DateTime.now)

时间:2014-09-22 18:27:35

标签: dart

来自C#背景,我发现自己经常编写如下代码:

var now = DateTime.now();
var delay = Future.delayed(...);

此代码不起作用(NoSuchMethodError : method not found: 'Symbol("now")'),我缺少单词new,因为它们是构造函数。我一遍又一遍地这样做,每次看到这个错误,我都会感到困惑,我才意识到我再次做错了!

这让我很好奇;使用像这样的构造函数比静态方法有一些优势,还是只是一个约定,因为Dart命名了构造函数?

对此有任何指导方针;我们应该在所有自己的代码中使用命名构造函数,我们通常会有一个返回实例的静态方法吗?

2 个答案:

答案 0 :(得分:4)

this

中找到Dart Style Guide

请使用构造函数而不是静态方法来创建实例。

使用new或const调用构造函数,它在调用点上清楚地传达正在创建对象的信息。 Dart中的命名构造函数和工厂构造函数为您提供了其他语言中静态方法的所有灵活性,同时仍允许调用点看起来像常规构造函数调用。

// GOOD
class Point {
  num x, y;
  Point(this.x, this.y);
  Point.zero()
      : x = 0,
        y = 0;
}

// BAD
class Point {
  num x, y;
  Point(this.x, this.y);
  static Point zero() => new Point(0, 0);
}

更新:命名构造函数的缺点

刚刚发现,你不能将构造函数传递给函数(例如作为函数)。必须将我的命名构造函数更改为静态方法! :(

答案 1 :(得分:1)

如果要使用泛型类型参数,则需要使用构造函数。函数不允许传递泛型类型参数,构造函数可以。