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

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

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

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

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

最佳答案

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?

这个问题的答案在Effective Java Item 17:继承的设计和文档,否则就禁止它。设计继承类需要做更多的工作,包括以下内容。

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

如果您已完成所有这些工作,那么您将不会仅提供静态工厂方法。您还将提供至少一个公共(public)或 protected 构造函数。

Effective Java 详细介绍了每一点,但最终的建议是,

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

关于java - effective Java Item1 - 用于创建对象的静态工厂方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41126121/

相关文章:

python - python如何在其中找到装饰函数?

java - 能够执行由另一个线程发送的特定作业的线程的任何可用设计模式?

java - ArrayLists 无法正确添加值?

java - 如何在 Java 中检索数组值?

c# - 可维护性的设计模式问题

hibernate - 在构造函数中使用多对一集合的 SELECT NEW() - HQL

c++ - 运算符重载中的显式构造?

java - 如何从构造函数返回错误消息(字符串)?

java - 在不阅读完整文件的情况下估计文件的字数

java - 比较 2 128 以下的整数