是否创建了新对象?

时间:2013-05-18 04:56:25

标签: java static-methods

我正在阅读Joshua Bloch的 Effective Java 。它让我在第1项中感到困惑,它说明了

  

静态工厂方法的第二个优点是,与构造函数不同,每次调用它们时都不需要创建新对象。

静态工厂方法是不是每次调用时都要创建一个新对象?

//constructor
Orange(){
}

//static factory method
static Orange staticFactoryMethod(){
    return new Orange;
}

不会调用构造函数或staticFactoryMethod创建Orange的实例吗?

Orange orange=new Orange();

Orange orange=Orange.staticFactoryMethod();

3 个答案:

答案 0 :(得分:2)

静态工厂并不总是需要创建新对象。 你可以这样:

static Orange staticFactoryMethod(){
    return new Orange();
}

但你也可以拥有像

这样的东西
static Orange staticFactoryMethod(){
    Orange o = ... //find an orange in a basket of available oranges that has been already initialized
    return o;
}

答案 1 :(得分:1)

  

静态工厂方法是不是每次调用时都创建一个新对象?

没有。工厂方法的目的是返回合适的对象。该对象可能是之前创建的对象。这一切都取决于工厂和对象的预期语义。例如,对象是不可变的,它们的对象标识没有特殊意义,那么共享实例可能是值得的优化。

例如,Integer.valueOf(int)方法返回Integer方法,该方法可能(对于小整数)已经创建并使用过。这样做的好处是可以减少创建的Integer个实例的数量......并且在完成后需要进行垃圾回收。

您还可以认为String.intern(String)是工厂方法的一种形式,尽管它具有不寻常的属性(在最近的实现中)它永远不会分配新的字符串。

第三个示例是一个线程或连接池,它尝试回收已返回池的对象。

相比之下,如果您的API的“客户”必须使用new来创建实例,那么您的API就没有机会执行此类操作。这是布洛赫的观点。

答案 2 :(得分:1)

查看Integer.valueOf(int i).如果i在-128到127范围内,则此方法不会创建新的Integer对象,而是从缓存中返回值。