儘量複用對象,而不是創建新的對象,特別是當一個對象是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);
}