《Effective Java》條目 3 指出:若對象不可變且頻繁使用,應避免重複創建,改用靜態工廠方法或單例模式復用實例。
public class PersonSlow {
private final Date birthDate;
public PersonSlow(Date birthDate) { this.birthDate = new Date(birthDate.getTime()); }
public boolean isBetweenTheDate() {
Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0);
Date timeStart = gmtCal.getTime();
gmtCal.set(1965, Calendar.JANUARY, 1, 0, 0, 0);
Date timeEnd = gmtCal.getTime();
return birthDate.compareTo(timeStart) >= 0 && birthDate.compareTo(timeEnd) < 0;
}
}
每次調用 isBetweenTheDate() 都創建兩個 Calendar 實例,性能開銷大。
public class PersonFast {
private Date birthDate;
private static final Date BOOM_START;
private static final Date BOOM_END;
public PersonFast(Date birthDate) { this.birthDate = new Date(birthDate.getTime()); }
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 isBetweenDate() {
return birthDate.compareTo(BOOM_START) >= 0 && birthDate.compareTo(BOOM_END) < 0;
}
}
靜態塊隨類加載執行一次,BOOM_START/END 成為常量,後續調用零創建開銷。若方法被千萬次調用,性能提升顯著。