new object is created or not?

2019-08-28 12:29发布

问题:

I am reading Effective Java by Joshua Bloch. It confuses me in the item 1, where it states

A second advantage of static factory method is that, unlike constructors, they are not required to create a new object each time time they're invoked.

Isn't the static factory method meant to create a new object each time it is invoked?

//constructor
Orange(){
}

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

Won't calling either the constructor or the staticFactoryMethod create an instance of Orange?

Orange orange=new Orange();

Orange orange=Orange.staticFactoryMethod();

回答1:

A static factory does not always need to create a new object. You can have this:

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

But you can also have something like

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


回答2:

Take a look at Integer.valueOf(int i). If i is within the range -128 to 127 this method will not create a new Integer object but return a value from cache.



回答3:

Isn't the static factory method is mean to create a new object each time it is invoked?

No. The purpose of a factory method is to return a suitable object. That object might be an object that was created earlier. It all depends on the intended semantics of the factory, and of the objects. For instance, it the objects are immutable and their object identity has no special significance, then sharing instances can be a worthwhile optimization.

For example, the Integer.valueOf(int) method returns an Integer method that may (for small integers) have been created and used previously. This has the advantage of reducing the number of Integer instances that are created ... and need to be garbage collected when they are finished with.

You could also argued that String.intern(String) is a form of factory method, though it has the unusual property that (in recent implementations) it never allocates new strings.

A third example is a thread or connection pool which tries to recycle objects that have been returned to the pool.

By contrast, if the "client" of your API has to use new to create instances, there is no opportunity for your API to do this kind of thing. That is Bloch's point.