package EffectiveJava;import java.util.Calendar;import java.util.Date;public class _2_4 {private final Date birthday;private static final Date start;private static final Date end;private transient Date s = null;private transient Date e = null;public _2_4(Date birthday) {this.birthday = birthday;}static { // 將這個方法寫在靜態地區塊中,這樣只需產生一個對象執行個體,大大提高了效率,但附加的對象貌似太臃腫,如果方法一次都不調用的話,這裡初始值就是浪費了Calendar cale = Calendar.getInstance();cale.set(1946, Calendar.JANUARY, 1, 0, 0);start = cale.getTime();cale.set(1965,Calendar.JANUARY,1,0,0);end = cale.getTime();}public boolean isBaby() { // 些方法每次被調用的時候都會產生一個Calendar 對象,而執行完方法後又迅速被垃圾收集機制回收,所以效率很慢Calendar cale = Calendar.getInstance(); cale.set(1946, Calendar.JANUARY, 1, 0, 0);Date start = cale.getTime();cale.set(1965,Calendar.JANUARY,1,0,0);Date end = cale.getTime();return birthday.compareTo(start)>0&&birthday.compareTo(end)<0;}public boolean bisBaby() { // 這是第三個方法,仿照的 hashmap 中的 keyset,定義兩個臨時變數 ,如果變數為空白,則初始化,如果不為空白,則不要初始化return this.birthday.compareTo(start)>0&&birthday.compareTo(end)<0;}public boolean cisBaby() {if(s==null || e ==null){Calendar cale = Calendar.getInstance();cale.set(1946, Calendar.JANUARY, 1, 0, 0);this.s = cale.getTime();cale.set(1965,Calendar.JANUARY,1,0,0);this.e = cale.getTime();}return s.compareTo(birthday)>0&&e.compareTo(birthday)<0;}public static void main(String args[]) {_2_4 person = new _2_4(Calendar.getInstance().getTime());long begin = System.currentTimeMillis();for(int i=0;i<1000000;i++) {person.bisBaby();//person.isBaby();person.cisBaby();}long end = System.currentTimeMillis();System.out.println(((double)end-begin)/1000+" s");//3.359 s 0.016 s}}