从Dart中的工厂构造函数返回null是否可以接受?

And*_*rew 5 null constructor factory dart

我一直在用Dart编写一些代码。我真的很喜欢工厂构造函数,但恐怕我在滥用它的用处。特别是在编写值对象类时,如果验证失败,有时会返回null。

class EmailAddress {
  static final RegExp _regex = new RegExp(...);
  final String _value;

  factory EmailAddress(String input) {
    return _regex.hasMatch(input) ? new EmailAddress._internal(input) : null;
  }

  const EmailAddress._internal(this._value);

  toString() => _value;
}
Run Code Online (Sandbox Code Playgroud)

一开始,这似乎还不错。但是,当您实际使用它时,这就是您所看到的。

methodThatCreatesAnEmailAddress() {
  var emailAddress = new EmailAddress("definitely not an email address");
  ...
}
Run Code Online (Sandbox Code Playgroud)

为什么这样不好的论点是,来自另一种静态类型的语言(例如Java或C ++)的开发人员会期望emailAddress始终被初始化为非null值。为什么这是完全可以接受的参数是构造函数是工厂,因此可以返回null值。

那么,这是不好的做法还是利用了有用的功能?

mez*_*oni 5

null从工厂返回值是可以接受的,因为factoryDart Factory 软件概念中的内置功能没有任何空限制。

另一方面,我可以改写您的问题“从相等运算符返回 null 是否可以接受”

bool operator ==(other) {
  return null;
}
Run Code Online (Sandbox Code Playgroud)

这也是可以接受的,因为没有这种运算符不能返回null值的限制。

但还有一个问题?为什么要这样做以及如何避免它?

factory EmailAddress(String input) {
  return _regex.hasMatch(input) ? new EmailAddress._internal(input) :
    throw "something went wrong";
}
Run Code Online (Sandbox Code Playgroud)

聚苯乙烯

我个人认为nullfactoryDart返回是bad practice因为Dart 中的工厂很难与构造函数区分开来。

从外面看,它们看起来像构造函数,区别在于它们更强大,因为它们可以构造不同类型的对象。

他们也有自己的限制,但这是另一回事。

  • 这不再是真的了,自从 dart 2.12 以来,凭借健全的 null 安全性,工厂不能再返回 null (4认同)

jam*_*lin 5

使用空安全 Dart,factory不再允许构造函数返回null.

迁移时factory返回的现有构造函数null预计将替换为static方法