创建对象:构造函数或静态工厂方法 我正在经历一个有效的java,我认为一些标准的东西不是书中提出的,例如,对象的创建,我的印象是构造函数是最好的方法,而书则说我们应该利用静态的工厂方法,我不能少一些优点和缺点,所以我问这个问题,这里是使用它的好处
优势:创建对象:构造函数或静态工厂方法 我正在经历一个有效的java,我认为一些标准的东西不是书中提出的,例如,对象的创建,我的印象是构造函数是最好的方法,而书则说我们应该利用静态的工厂方法,我不能少一些优点和缺点,所以我问这个问题,这里是使用它的好处,java,design-patterns,object,static,constructor,Java,Design Patterns,Object,Static,Constructor,优势: 静态工厂方法的一个优点是,与构造函数不同,它们 有名字 静态工厂方法的第二个优点是,与构造函数不同, 它们不需要在每次被调用时创建新对象 静态工厂方法的第三个优点是,与构造函数不同, 它们可以返回其返回类型的任何子类型的对象 静态工厂方法的第四个优点是减少了冗长 创建参数化类型实例的方法 缺点: 只提供静态工厂方法的主要缺点是 没有公共或受保护构造函数的类不能被子类化 静态工厂方法的第二个缺点是它们不是 易于区别于其他静态方法 参考:有效Java,Joshua Bloch,第2版,第5-
我无法理解第四个优点和第二个缺点,如果有人能解释这些要点,我将不胜感激。我还想了解如何决定使用构造函数还是静态工厂方法来创建对象。如果您知道要创建的类的具体类型,那么调用构造函数就可以了 当您不完全确定如何构造所需的对象时,静态工厂方法很好 工厂方法仍然调用具体类型的构造函数,但是该方法处理关于实例化哪种具体类的决策。然后,Factory方法返回一个接口类型(而不是具体类型),以便对调用方隐藏具体类型。
- 优点4:当使用构造函数时,您有
Foo<Map<Key, Value>> foo = new Foo<Map<Key, Value>>();
vsFoo-Foo=new-Foo();
当引入菱形语法时,Java7将不再具有这种优势Foo-Foo=Foo.createFoo();//无需重复
- 劣势2。您很难判断给定的
方法是用于构造函数还是用于其他对象静态
至于如何选择,没有单一的食谱。您可以在给定的用例中权衡上述所有优点和缺点,但大多数情况下,这只是一个由经验驱动的决策。缺点2。 用于创建对象的静态方法与任何其他静态函数具有相同的功能布局和外观 仅仅通过查看创建对象的静态方法,你不会知道它会这样做,相反的是相关部分。在编写不熟悉的代码时,可能很难识别用于创建对象的正确静态方法
的使用有很好的文档记录,并且非常有用,特别是在和情况下。在初始化复杂对象时也很有用。IMHO,它归结为复杂性:如果你的代码除了你之外没有人扩展,你是否需要创建更多的复杂性?即使没有其他人会扩展代码,如果您在几个月后再回来做维护/bug修复etcSo,它仍然需要很容易理解,那么说构造函数不会创建复杂性,静态工厂方法会创建复杂性,这是否公平呢?我正在试图了解哪种方法会带来更大的复杂性?Bozho:对于缺点2,您能否建议一个用例,不知道给定的静态方法是否用于构造函数将导致重大问题?我只是想弄明白有害的影响是什么,为什么会被称为不利因素?@Rachel:在类
Foo
中使用静态方法getFoo()
会有什么作用?创建并返回新的Foo
?或者返回Foo
的子实例?甚至是一个单例实例?然而,缺点2可以通过智能方式选择方法名来监控,如createFoo()
、getChildFoo()
和getInstance()
。这都是关于编写自文档代码的。@BalusC:谢谢你的解释,我试图比较静态工厂方法和构造函数,看看这本书为什么推荐静态工厂方法。你提到了一些关于diamond syntax
,它是什么以及它是如何工作的?Foo-Foo=new-Foo()代码>工厂方法的一个有用方面是,在许多情况下,工厂方法的未来版本可以返回其他类型,而不必更改底层代码。例如,ImmutableMatrixOfDouble.Create
方法可能会查看其参数是否为只有非零元素在对角线上的方阵,并在这种情况下返回ImmutableDiagonalMatrix
()。256x256ImmutableDiagonalMatrix
只需要256x256数组的1/256左右的空间,因此如果许多不可变数组恰好适合该模式,则可以节省空间。
Foo<Map<Key, Value>> foo = Foo.createFoo(); // no need to repeat