Effective Java Item1 - 用于创建对象的静态工厂方法

时间:2016-12-13 16:36:37

标签: java design-patterns constructor effective-java static-factory

我正在阅读有效的java项目1,其中讨论了用于创建对象的“静态工厂方法与构造函数”。提到的缺点之一是:

“仅提供静态工厂方法的主要缺点是没有公共或受保护构造函数的类不能被子类化。”

还提到这很好,因为它会将对象组合提升为继承。但是,当你确实想要继承时,这不是一个严重的限制吗?为什么我不喜欢用于创建对象的静态工厂方法,如果我之前不知道该类是否会被扩展?

2 个答案:

答案 0 :(得分:1)

  

为什么我更喜欢用于创建对象的静态工厂方法,如果我之前不知道该类是否会被扩展?

这个问题的答案在于有效的Java第17项:继承的设计和文档,或者禁止它。设计继承类需要更多的工作,包括以下内容。

  1. 准确记录覆盖任何方法的影响。
  2. 提供钩子方法。
  3. 测试子类(通过自己实现这些类)。
  4. 限制构造函数以避免所有可覆盖的方法。
  5. 考虑animIDCloneable接口及其对继承的影响。
  6. 如果您已完成所有这些工作,那么您将不会仅提供 静态工厂方法。您还将提供至少一个公共或受保护的构造函数。

    有效的Java详细介绍了这些要点,但最后的建议是,

      

    此问题的最佳解决方案是禁止在未设计和记录的类中进行子类化,以便安全地进行子类化。

答案 1 :(得分:0)

引用是:

  

仅提供静态工厂方法的主要缺点是没有公共或受保护构造函数的类不能被子类化。

不是静态工厂,而是仅提供静态工厂方法,感觉不同。

你必须设计扩展,而不是“好吧,也许我现在不太确定,但我会留下它可扩展以防万一”。

如果你的类是可扩展的,那么它至少需要一个公共构造函数。在这种情况下,您可以提供静态工厂方法。但我不会称之为严重的限制。