重复使用同一个对象,而不是每次去创建同一个功能相同的对象。比如前后需要的字符串的字面量相同
String s = new String("silly");
如果每次都这样去创建字符串,那么是非常糟糕的,虽然每次都是“silly”,都每次都是新的字符串
应该这样做
String s = "No longer silly";
对于提供了静态工厂方法的类,也可以使用静态工厂方法提供同一个类
下面是多次创建重复对象的另一个例子
class Person{
private final Date birthDate;
public Person(Date birthDate){
this.birthDate = birthDate;
}
public boolean isBabyBoomer(){
Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
gmtCal.set(1946, Calendar.JANUARY, 1, 0,0,0);
Date boomStart = gmtCal.getTime();
gmtCal.set(1965, Calendar.JANUARY, 1, 0,0,0);
Date boomEnd = gmtCal.getTime();
return birthDate.compareTo(boomStart) >= 0 &&
birthDate.compareTo(boomEnd) < 0 ;
}
}
isBabyBoomer每次被调用的时候,都会创建新的新的gmtCal 、boomStart、 boomEnd ,这是没有必要的
一种正确做法
class Person{
private final Date birthDate;
public Person(Date birthDate){
this.birthDate = birthDate;
}
private static final Date BOOM_START;
private static final Date BOOM_END;
static {
Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
gmtCal.set(1946, Calendar.JANUARY, 1, 0,0,0);
BOOM_START = gmtCal.getTime();
gmtCal.set(1965, Calendar.JANUARY, 1, 0,0,0);
BOOM_END = gmtCal.getTime();
}
public boolean isBabyBoomer(){
return birthDate.compareTo(BOOM_START) >= 0 &&
birthDate.compareTo(BOOM_END) < 0 ;
}
}
并不是主张仍何时候避免创建对象,而是在必要的时候避免,如字面量相同的String。在现代的JVM中,对于小对象的创建和回收是非常廉价的,所以正确创建对象可以使代码更加的清晰、简洁