我一直在阅读Joshua Bloch的《 Effective Java》,到目前为止,它确实名副其实。第一项为静态工厂方法优于构造函数提供了一个令人信服的案例。以至于我开始质疑好的旧构造函数的有效性:)。
本书的优缺点总结如下:
好处:
- 他们有名字!
- 我们拥有完全的实例控制(单例、性能等)
- 他们可以返回一个子类型/接口
- 编译器可以提供类型推断
缺点:
- 私有类不能被子类化
- 它们不像构造函数那样在文档中脱颖而出
第一个缺点实际上可能是一件好事(如书中所述)。第二个,我认为只是一个小缺点,可以通过即将发布的 java 版本轻松解决(javadoc 的注释等)
看起来,最终工厂方法几乎具有构造函数的所有优点,还有更多优点,而没有真正的缺点!
所以,我的问题基本上分为三个部分:
- 默认情况下始终使用静态工厂方法而不是构造函数是一种好习惯吗?
- 使用构造函数是否合理?
- 为什么面向对象的语言不为工厂提供语言级别的支持?
注意:有两个类似的问题:什么时候使用 Constructor 和什么时候使用 getInstance() 方法(静态工厂方法)?和对象的创建:构造函数或静态工厂方法。然而,答案要么只是提供上面的列表,要么重申我已经知道的静态工厂方法背后的基本原理。