5、避免建立不必要的物件
避免建立不必要的物件
一般來說最好是重用物件,而不是每次需要的時候都建立一個相同的物件。
反例
千萬不要這樣做,因為穿進去的引數“aa”本身就是一個String例項
String s = new String("aa");
應該這樣:
String s = "aa";
而且,它可以保證對於所有同一臺虛擬機器中的執行的程式碼,只要它們包含相同的字串字面常量,該物件就會被重用
對於提供靜態工廠和建構函式的 不可變類,優先使用靜態工廠(不需要每次都建立新的)
除了重用不可變的物件外,還可以重用已知不會被修改的可變物件
反例:
//判斷一個人出生的時間是否在嬰兒潮期間內
public class Person {
private final Date birthDate;
public Person(Date birthDate) {
// Defensive copy - see Item 39
this.birthDate = new Date(birthDate.getTime());
}
// Other fields, methods omitted
// DON'T DO THIS!
//Date算出來實際就不需要改變了
public boolean isBabyBoomer() {
// Unnecessary allocation of expensive object
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;
}
}
正確案例:
class Person {
private final Date birthDate;
public Person(Date birthDate) {
// Defensive copy - see Item 39
this.birthDate = new Date(birthDate.getTime());
}
// Other fields, methods
/**
* The starting and ending dates of the baby boom.
*/
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;
}
}
通過維護自己的物件池(pool)來避免建立物件並不是一種好的做法,除非是重量級的物件,比如資料庫物件(代價昂貴)
相關文章
- 第5條:避免建立不必要的物件物件
- 建議:避免建立不必要的物件。物件
- 如何在Android中避免建立不必要的物件Android物件
- 避免不必要的排序(二)排序
- 避免不必要的排序(一)排序
- 5 個技巧避免不必要的瀏覽器相容性問題瀏覽器
- 來自Kenneth Reitz大神的建議:避免不必要的物件導向程式設計物件程式設計
- 第22章 物件共享,避免建立多物件——享元模式物件模式
- 使用rebase避免公共分支出現不必要的提交記錄
- Java中建立物件的5種方式Java物件
- 最全--Java中建立物件的5種方法Java物件
- 07物件的建立物件
- JavaScript物件與建立物件的方式JavaScript物件
- new BigDecimal時,請使用字串作為引數為最佳,避免不必要的麻煩Decimal字串
- 5個需要避免的CSS錯誤CSS
- 物件的建立和分配物件
- JavaScript 建立物件的方式JavaScript物件
- js建立物件的方法JS物件
- Java 物件建立的流程Java物件
- js建立物件的方式JS物件
- 類與物件的建立物件
- 將SQL質量審計引入軟體開發可以避免不必要的SQL優化工作SQL優化
- JavaScript物件導向—物件的建立和操作JavaScript物件
- 【JavaScript】ES5/ES6 建立物件與繼承JavaScript物件繼承
- 如何避免在Flask中使用Response物件Flask物件
- 物件建立模式物件模式
- JS 建立物件JS物件
- JavaScript建立物件JavaScript物件
- js建立物件JS物件
- 詳解Java的物件建立Java物件
- 建立一個物件的集合物件
- 最簡單的物件建立物件
- 建立物件的幾種模式物件模式
- JS中建立物件的方法JS物件
- iOS 建立物件的姿勢iOS物件
- 原生ajax的XMLHttpRequest物件的建立XMLHTTP物件
- js物件導向設計---建立物件的方式JS物件
- 物件建立模式和類建立模式的區別物件模式