5

好吧,我有一个非常概念性的问题。很多东西看起来像织物,我不确定它的好处在哪里。例如

public class MyObject {
public MyObject() {

}
public static MyObject create() {
    return new MyObject();
}

public void doSomething(){
    // some code...
};

}

从我的角度来看,唯一的好处是对代码的出价更少。在我看来,对性能没有影响。还有其他好处吗?

MyObject myobject = new MyObject();

或者

MyObjecct myobject = MyObject.create();

谢谢

4

6 回答 6

5

您是正确的,因为没有显着的性能差异;而使用这种形式的原因主要是代码的可读性。

一般来说,如果您使用静态创建函数,您将声明构造函数私有,从而确保您的用户只能使用静态函数创建对象

一般来说,我认为静态创建不会给代码增加太多,对于普通的日常物品来说,新的可能更清晰、更直接。

但是在某些情况下,我认为静态构造函数很有用:

  1. 对于大型复杂对象的构造,尤其是在初始化中涉及很多复杂性的对象 - 通常一个简单的构造函数会误导库用户假设构造任务快速而简单。
  2. 如果您有多个参数不明确的构造函数,您可以使用静态函数名称使其更具可读性,例如您可能有 createFromFile(String FileName) 和 createFromJSONEncoding(String Data)
  3. 您想控制是否实际创建了一个新对象 - 例如,如果这是一个只读资源,您可能会保留已经打开的资源缓冲区,如果库用户两次请求相同的资源,您可以简单地给他们一个已经缓存副本(而不是制作新的副本)
于 2013-06-26T13:50:27.807 回答
2

Joshua Bloch在 Effective Java 第 2 章第 1项中解决了这个问题:考虑静态工厂方法而不是构造函数;这里有几个亮点:

  • “静态工厂方法的一个优点是,与构造函数不同,它们有名称。” -- 你不能有两个不同的构造函数接受一个int参数,但你可以有两个静态工厂方法调用createWithAge(int age)createWithHeight(int height)
  • “静态工厂方法的第二个优点是,与构造函数不同,它们不需要在每次调用时都创建一个新对象。”
  • “静态工厂方法的第三个优点是,与构造函数不同,它们可以返回其返回类型的任何子类型的对象。”

如您所见,关注点与性能几乎没有关系(除了重用缓存实例),而主要与面向对象的设计有关。

免责声明:糟糕,我刚刚看到已经针对不同的问题发布了相同的答案(解释得更好):https ://stackoverflow.com/a/3169644/262683 。我的错...

于 2013-06-26T13:52:03.993 回答
1

这个问题没有答案。

事实上,这两种模式都是构造适用于特定情况的对象的合法方式。

静态工厂方法在实例控制非常重要的情况下很重要,例如在维护对象缓存或池的系统中。

new 运算符因其简单而易于使用,并且对于为继承而设计的类相当重要。

你在问什么是最佳实践。答案是最佳实践取决于您的目标,并且与此类问题一样,最佳实践是智能地使用可用工具来实现可扩展和可维护的解决方案。

我建议关闭这个问题。

于 2013-06-26T13:48:35.960 回答
1

我看到你可能需要使用的情况create

您必须控制类的每个实例的创建。例如,您计算创建的对象数量或以某种方式链接它们,以及实例数量是否达到您期望的最大抛出异常。

工厂模式也可能很有趣。

如果您不确定,只需通过创建new

如果你选择一起去,create你可能想让你的构造函数私有

于 2013-06-26T13:43:03.337 回答
0

这是一个(简单的) 工厂模式。请检查 Wikipedia 条目的适用性部分以查看其使用位置。

于 2013-06-26T13:43:13.070 回答
0

现在,当您不希望任何其他类创建您的类对象时,您可以将类构造函数设为私有:

private MyObject()

现在任何想要创建你的类对象的类都必须这样做:

MyObjecct myobject = MyObject.create();

因为现在在其他一些类中这样做MyObject myobject = new MyObject();会导致编译器错误。

于 2013-06-26T13:44:30.000 回答