0

我正在阅读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();
4

3 回答 3

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;
}
于 2013-05-18T05:03:09.823 回答
1

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

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

例如,该Integer.valueOf(int)方法返回一个Integer可能(对于小整数)之前已创建和使用的方法。这样做的好处是减少了Integer创建的实例的数量......并且在它们完成时需要进行垃圾收集。

你也可以说这String.intern(String)是工厂方法的一种形式,尽管它有一个不寻常的属性,即(在最近的实现中)它从不分配新的字符串。

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

相比之下,如果你的 API 的“客户端”必须new用来创建实例,你的 API 就没有机会做这种事情。这就是布洛赫的观点。

于 2013-05-18T05:02:42.930 回答
1

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

于 2013-05-18T05:05:03.847 回答