我正在阅读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();
答案 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对象,而是从缓存中返回值。