对象的创建:构造函数或静态工厂方法

Rac*_*hel 18 java static constructor design-patterns object

我正在阅读有效的Java,我认为标准的一些东西并没有被本书所建议,例如对象的创建,我的印象是构造函数是最好的方法,书籍说我们应该使用静态工厂方法,我不能少一些优点和缺点,所以我问这个问题,这是使用它的好处.

好处:

  1. 静态工厂方法的一个优点是,与构造函数不同,它们具有名称.
  2. 静态工厂方法的第二个优点是,与构造函数不同,它们不需要在每次调用时创建新对象.
  3. 静态工厂方法的第三个优点是,与构造函数不同,它们可以返回其返回类型的任何子类型的对象.
  4. 静态工厂方法的第四个优点是它们减少了创建参数化类型实例的详细程度.

缺点:

  1. 仅提供静态工厂方法的主要缺点是没有公共或受保护构造函数的类不能被子类化.
  2. 静态工厂方法的第二个缺点是它们不容易与其他静态方法区分开.

参考:Effective Java,Joshua Bloch,第2版,第5-10页

我无法理解第四个优势和第二个缺点,如果有人能解释这些要点,我将不胜感激.我还想了解如何决定是使用构造函数还是静态工厂方法来创建对象.

Boz*_*zho 17

至于如何选择 - 没有单一的配方.在给定用例的情况下,您可以权衡上述所有优点和缺点,但大多数情况下,它只是由经验驱动的决策.

  • @Rachel:类`Foo`中的静态方法`getFoo()`会做什么?创建并返回一个新的`Foo`?或者返回`Foo`的子实例?甚至是单身实例?然而,可以通过选择方法名称来监督等等,例如`createFoo()`,`getChildFoo()`和`getInstance()`.这都是关于编写自我记录的代码. (3认同)

Jus*_*ner 5

如果您知道要创建的类的具体类型,则可以调用Constructor。

当您不确定如何构造所需的对象时,可以使用静态工厂方法。

Factory方法仍然在具体类型上调用构造函数,但是该方法处理有关实例化哪种具体类的决定。然后,工厂方法将返回接口类型(而不是具体类型),以便对调用者隐藏具体类型。