0

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

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

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

4

2 回答 2

1

当我以前不知道类是否要扩展时,为什么我更喜欢静态工厂方法来创建对象?

这个问题的答案在 Effective Java Item 17: Design and Document for Inheritance or else Prohibit It中。为继承设计一个类需要更多的工作,包括以下内容。

  1. 准确记录覆盖任何方法的效果。
  2. 提供钩子方法。
  3. 测试子类(通过自己实现这些类)。
  4. 限制构造函数以避免所有可覆盖的方法。
  5. 考虑CloneableandSerializable接口,以及它们对继承的影响。

如果您已经完成了所有这些工作,那么您将不会提供静态工厂方法。您还将提供至少一个公共或受保护的构造函数。

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

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

于 2016-12-14T13:53:21.990 回答
0

报价是:

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

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

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

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

于 2016-12-13T17:00:15.153 回答