重复使用同一个对象,而不是每次需要时就创建一个功能上等价的对象
String s = new String("silly");
每次执行的时候创建一个新的String实例,但没有一个是真正需要的的,如果在for中将有很多对象被创建出来
String s ="silly"只创建一个对象
构造函数每次调用时总是创建一个新的实例,而静态工厂方法不要求这样做
public class Person {
private final Date birthData;
public Person(Date birthDate) {
this.birthData = birthDate;
}
// 每次被调用是Calendar、TimeZone都要创建一次,date2次,
// 所以不要用这个方法
public boolean isBabyBoorer() {
Calendar gmtCalendar = Calendar
.getInstance(TimeZone.getTimeZone("GMT"));
gmtCalendar.set(1946, Calendar.JANUARY, 1, 0, 0, 0);
Date boomStart = gmtCalendar.getTime();
gmtCalendar.set(1965, Calendar.JANUARY, 1, 0, 0, 0);
Date boomEnd = gmtCalendar.getTime();
return birthData.compareTo(boomStart) >= 0
&& birthData.compareTo(boomEnd) < 0;
}
}
------------------------------------------------------------------------------------------------
/**
* 在初始化时创建一次Calendar、TimeZone都要创建一次,date2次,
* ,而不是每次调用时创建,提高性能
*
* @author dzl
*
*/
class Person2 {
private final Date birthData;
public Person2(Date birthDate) {
this.birthData = birthDate;
}
private static final Date BOOM_START;
private static final Date BOOM_END;
static {
Calendar gmtCalendar = Calendar
.getInstance(TimeZone.getTimeZone("GMT"));
gmtCalendar.set(1946, Calendar.JANUARY, 1, 0, 0, 0);
BOOM_START = gmtCalendar.getTime();
gmtCalendar.set(1965, Calendar.JANUARY, 1, 0, 0, 0);
BOOM_END = gmtCalendar.getTime();
}
public boolean isBabyBoorer() {
return birthData.compareTo(BOOM_START) >= 0
&& birthData.compareTo(BOOM_END) < 0;
}
}
当然,小对象的构造和回收是非常廉价的,特别是现代的JVM强大的功能超过自己维护对象池的性能。在提倡使用保护性拷贝的场合,重用一个对象招致的代价大于重复创建对象而招致的代价。所以如何使用要斟酌。