Dart 工厂构造函数 vs 静态方法;例如为什么 int.parse() 不是一个工厂构造函数?

23

Dart风格指南建议使用构造函数而不是静态方法来创建实例, 因为“Dart中的命名构造函数和工厂构造函数为您提供了其他语言中静态方法的所有灵活性,同时仍允许调用方看起来像常规构造函数调用”。

那么,将int.parse()double.parse()声明为静态方法而不是工厂构造函数是否有技术原因呢?

更一般地说,在Dart中选择编写工厂构造函数还是静态(工厂)方法的准则是什么?


是的,这似乎有点不一致。从那个角度来看,new int.fromString() 更合理。尽管 int.parse() 感觉更自然。 - ronag
这可能很可能是另一种性能优化的特殊处理方式,但那只是猜测。 - MarioP
@MarioP:是的,我想那很有道理。然而,我希望编译器足够好,能够优化这样的代码,不需要进行特殊处理。 - ronag
@ronag 无论如何,结果证明我错了。"感觉更自然"实际上更接近;-) - MarioP
1个回答

20

在 Google Groups 上搜索了一段时间后,我确实找到了官方的解释:讨论链接

为了档案保留,这里引用自链接的文本:

我曾考虑把它做成构造函数,但对于 int 或 double 值并不合适。

我认为“parse”更像是一个实用函数,而不是构造函数,可能是因为 int 和 double 并没有其他构造函数。你不会创建一个整数,而是发现它。

此外,当前唯一检查字符串是否为数字字面值的方法是调用 parse 并查看它是否抛出异常(但我对此并不完全满意!),而我不喜欢除编程错误以外的任何情况下都会抛出异常的构造函数。

而且这样做不需要在前面加上 “new”,也没有特别的好处。

没有单个硬性原因明显地使它不是构造函数,但有一堆较小的问题共同使我更喜欢将其作为静态函数。

那么我的“性能优化”理论就到此为止了。哦,算了吧。


6
自Dart 2.0开始,使用new被不鼓励,所以现在实际上没有什么区别了。 - Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接