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

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

优势:

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

弊:

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

参考:有效的Java,Joshua Bloch,第2版,第5-10页

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


答案 1
  • 优点4:使用构造函数时,您有

    Foo<Map<Key, Value>> foo = new Foo<Map<Key, Value>>();
    

    Foo<Map<Key, Value>> foo = Foo.createFoo(); // no need to repeat
    

    这个优势在Java 7中将消失,届时菱形语法将被引入。

  • 缺点 2.您无法轻松判断给定方法是用于构造函数还是用于其他目的。static

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


答案 2

如果您知道要尝试创建的类的具体类型,则调用构造函数即可。

当您不完全确定如何构造所需的对象时,静态工厂方法很好。

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