【问题标题】:How to build Null Factory Constructors with Null Safety?如何构建具有空安全性的空工厂构造函数?
【发布时间】:2020-10-14 02:30:12
【问题描述】:

在 null 安全之前创建静态方法持有者类的常见 Dart 模式如下:

class MyMethodScope {
  /// Prevents instantiation of this class.
  factory MyMethodScope._() => null;

  static void noop() {}
}

这对于 null safety 是不可能的,因为工厂构造函数的返回类型显然不能为空。

【问题讨论】:

  • 你能举例说明如何调用工厂方法吗?我还没有使用新的 null 安全性对其进行测试,但我相信允许工厂返回 null,也许您在调用它的地方使用新的符号 MyMethodScope?让它知道它可以为空
  • @EdwynZN 不打算被称为 - 它基本上是一种安全措施。这是新的 null 安全性的编译时错误:)
  • 是的,我现在看到所有都是 null 安全的,除非您明确表示不这样做,但是工厂构造函数没有返回类型来使用 ?
  • @EdwynZN 是的,这正是我想知道的(:

标签: flutter dart dart-null-safety


【解决方案1】:

基于https://github.com/dart-lang/language/issues/604,看起来工厂构造函数不能再返回null,所以你不能这样做。

您也可以只使用返回非空对象的私有构造函数(无论是否factory)。这仍然会阻止类在库之外实例化。 (当然,它不会阻止类在库中实例化,但您可以避免这样做,因为您控制自己的库。如果您仍然担心意外实例化,可以将类移到单独的库中.)

或者只是将类声明为abstract,这是防止类被实例化的常规直接方法。

另外,Effective Dart says to avoid such classes

【讨论】:

  • 我遇到了具有构造函数参数的单例类的问题。编译器无法识别工厂中设置了不可为空的成员。如果我 a) 将我的成员定义为可为空或 b) 使用 late 修饰符,它将编译。有谁知道是否有更好的方法?路径 a 没有显示出明确的意图,路径 b 感觉有点尴尬。
  • @NathanAgersea 不可为空的成员应由factory 构造函数委托给的非factory 构造函数初始化。
  • 我为此陷入了困境,据我所知,单例并不打算提供构造函数参数。所以路径 b) 设置类成员的后期关键字,并委托给工厂,遵循 builder 是正确的。我有这个权利吗?
  • @NathanAgersea Singletons 通常对构造函数参数没有意义,但它们是可能的。您只需要定义它的含义:提供不同的参数应该创建一个新对象还是返回现有对象?如果返回现有对象,是否应该对其进行变异?有关示例,请参阅 stackoverflow.com/a/69669603
  • 我的单例本质上是我用来维护共享代码的包的配置。
猜你喜欢
  • 2021-06-12
  • 2021-08-12
  • 1970-01-01
  • 1970-01-01
  • 2021-04-06
  • 2017-03-19
  • 1970-01-01
  • 2023-03-05
  • 2014-11-03
相关资源
最近更新 更多