《Effective Java 中文版 第2版》學習筆記 第5條:避免創建不必要的對象
阿新 • • 發佈:2017-10-07
多余 除了 示例 中文 註意 構造器 stat get tro
最好能重用對象而不是在每次需要的時候就創建一個相同功能的新對象。如果對象是不可變的,它就始終可以被重用。
1 String s = new String("stringette");
每次執行該語句時都會創建一個新的String實例,傳遞給String構造器的參數(“stringette”)本身是一個String實例,功能方面等同於構造器創建的所有對象。如果這種用法是在一個循環中,或者是在一個被頻繁調用的方法中,會創建出成千上萬不必要的String實例。
1 String s = "stringette";
只用了一個String實例,而不是每次執行的時候都創建一個新的實例。對於所有在同一臺虛擬機中運行的代碼,只要它們包含相同的字符串字面常量,該對象就會被重用。
對於同時提供了靜態工廠方法(見第1條)和構造器的不可變類,使用靜態工廠方法而不是構造器,避免創建不必要的對象。除了重用不可變的對象之外,也可以重用已知不會被修改的可變對象。
在Java 1.5發行版本中,有一種創建多余對象的新方法,稱作自動裝箱(autoboxing)。它允許程序員將基本類型和裝箱基本類型混用,按需要自動裝箱和拆箱。
1 public static void main(String[] args) { 2 Long sum = 0L; 3 for (long i = 0; i < Integer.MAX_VALUE; i++) { 4 sum += i;5 } 6 System.out.println(sum); 7 }
每次sum增加時都會構造一個Long類實例,速度變慢。註意:要優先使用基本類型而不是裝箱基本類型,要當心無意識的自動裝箱。
通過維護對象池(object pool)來避免創建對象不是好的做法,除非池中的對象是非常重量級的。正確使用對象池的典型對象示例是數據庫連接池。建立數據庫連接的代價是非常昂貴的,而且數據庫的許可可能限制只能使用一定數量的連接。
參考資料
《Effective Java 中文版 第2版》 P17-20
《Effective Java 中文版 第2版》學習筆記 第5條:避免創建不必要的對象