Effective Java 學習筆記(5)

儘量複用對象,而不是創建新的對象,特別是當一個對象是immutable(不可改變)的時候。

如String對象,

String s= new String(“String”);   千萬不要這樣做,因爲這裏實際上創建了兩個對象。

要避免出現這樣的情況,

1是可以用靜態工廠函數,來解決,如類庫中的Boolean.valueOf(“true”),這種方式要優於new Boolean(“true”);

2.是儘量複用對象。

看書中的例子。

public class Person {
          private final Date 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就會創建兩個Data對象,一個Calendar對象和TimeZone對象.

改進版:

class Person {
                    private final Date 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;
              }
}

這個改進版把這現兩個常量作成了static,這樣,只在加載的時候創建對象,以後調用就不產生任何對象。

還一個問題是要注意基本類型和對象的轉換。要注意避免寫以下的程序。以下會在加和比較的時候創建一個Long對象,這根本不是必要的。

public static void main(String[] args) {
            Long sum = 0L;
            for (long i = 0; i < Integer.MAX_VALUE; i++) {
                   sum += i;
            }
            System.out.println(sum);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章