Java Best Practice new vs .create()

时间:2013-06-26 13:38:32

标签: java conceptual

嗯,我有一个非常概念性的问题。很多东西看起来像面料,我不知道哪里有很大的好处。 例如

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();

由于

6 个答案:

答案 0 :(得分:5)

你说得对,没有明显的性能差异;使用此表单的原因主要是代码的可读性。

通常,如果使用静态创建函数,则会将构造函数声明为私有,从而确保用户只能使用静态函数创建对象

一般来说,我认为静态创建不会增加代码,广告对于普通的日常用品而言,新的可能更清晰,更直接。

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

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

答案 1 :(得分:2)

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

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

如您所见,问题几乎与性能无关(重用缓存实例除外),但主要与面向对象设计有关。

免责声明:哎呀,我刚刚看到相同的答案(更好的解释)已经发布了一个不同的问题:https://stackoverflow.com/a/3169644/262683。我的坏......

答案 2 :(得分:1)

我知道你可能需要使用create

的情况

您必须控制类的每个实例的创建。例如,您计算创建的对象数或以某种方式链接它们,如果实例数达到了您想要的最大抛出异常。

同样factory pattern可能会有趣。

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

创建

如果您选择使用create,您可能希望将构造函数设为私有

答案 3 :(得分:1)

这个问题没有答案。

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

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

new运算符很简单,对于为继承而设计的类非常重要。

您在问什么是最佳做法。答案是,最佳实践取决于您的目标,并且对于此类问题,最佳实践是巧妙利用可用工具来实现可扩展和可维护的解决方案。

我建议关闭这个问题。

答案 4 :(得分:0)

这是一个(简单化)Factory Pattern。请查看维基百科条目的适用性部分,了解它的使用位置。

答案 5 :(得分:0)

现在,当你不想要任何其他课程来创建你的课程时,对象然后你让你的类构造函数私有:

private MyObject()

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

MyObjecct myobject = MyObject.create();

因为现在在其他类MyObject myobject = new MyObject();内执行此操作会导致编译器错误。