避免创建重复的对象:
public class Person { private final Date birthDate; //Other fields omitted public Person(Date birthDate){ this.birthDate = birthDate; } //Don't do this 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,10,0,0,0); Date boomEnd = gmtCal.getTime(); return birthDate.compareTo(boomStart) >= 0 && birthDate.compareTo(boomEnd) < 0 ; } public static void main(String[] args) { ; System.out.println(new Person(new Date()).isBabyBoomer()); } }
isBabyBoomer每次被调用的时候,都会创建一个新的Calendar、一个新的TimeZone和两个新的Date实例,这是不必要的。下面的版本用一个静态的初始化器(initalizer),避免上面例子的低效率:
public class Person {
private final Date birthDate;
//Other fields omitted
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,10,0,0,0);
BOOM_END = gmtCal.getTime();
}
public boolean isBabyBoomer1(){
return birthDate.compareTo(BOOM_START) >= 0 && birthDate.compareTo(BOOM_END) < 0;
}
}
改进版本的Person类仅在初始化的时候创建Calendar,TimeZone和Date实例一次,而不是每次isBabyBoomer被调用的时候创建它们。
如果isBabyBoomer方法永远不会被调用,那么Person类的改进版本就没有必要去初始化BOOM_START和BOOM_END域。通过迟缓初始化(Lazy initalizing)将这些域的初始化推迟到isBabyBoomer方法第一次被调用的时候,则有可能消除这些不必要的初始化工作,但不推荐这样做。如迟缓初始化(Lazy initialization)中常见的情况一样,这样做会使方法的实现更加复杂,从而无法获得性能上的显著提高。