有效 Java Item1 - 对象创建的静态工厂方法

Effective Java Item1 - Static factory method for object creation

我正在阅读有效 java 项目 1,其中讨论了对象创建的 "Static factory method vs constructors"。提到的缺点之一如下:

"The main disadvantage of providing only static factory methods is that classes without public or protected constructors cannot be subclassed."

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

报价是:

The main disadvantage of providing only static factory methods is that classes without public or protected constructors cannot be subclassed.

不是静态工厂,而是只提供静态工厂方法,感受差异。

您必须为扩展而设计,而不是 "well, maybe I am not quite sure now, but I'll leave it extensible just in case"。

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

Why should I prefer static factory methods for object creation, when I do not know from before if the class is going to be extended or not?

这个问题的答案在有效 Java 项目 17:继承的设计和文件,否则禁止。为继承设计 class 需要做更多的工作,包括以下内容。

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

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

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

The best solution to this problem is to prohibit subclassing in classes that are not designed and documented to be safely subclassed.