1、避免創建不必要的對象
阿新 • • 發佈:2017-08-11
創建對象 ger 簡潔 每次 final nal turn fin 什麽
一般來說,最好能重用對象而不是在每次需要的時候就創建一個相同功能的新對象。
1、去除重復創建的字符串實例
1 String s = new String("china"); 2 // "china"本身就是一個String的實例對象,通過new String("china");構造器方式又創建對象。等於說,這裏創建了兩次。如果在一個循環當中,這裏一行代碼將創建成千上萬多余的實例。
1 String s= "china"; 2 // 這裏只創建了一次實例,同時,由於JVM的字符串常量池的機制,相同字面量的字符串實例會被重復使用,去除了大量多余創建。
2、同時提供了靜態工廠方法和構造器的不可變類,優先使用靜態工廠方法。
構造器使用一次就會創建一個對象,靜態工廠方法將會通過一些機制復用對象,如果兩者都提供的時候,自然優先考慮使用靜態工廠方法。
3、使用靜態初始化器
1 class Person{ 2 private static final String name; 3 static{ // 這裏使用靜態域初始化數據 4 name = "lay"; 5 } 6 public static String getName(){ 7 return name; // 每次都獲取同一個實例 8 }9 }
4、優先使用基本數據類型而不是裝箱,當心無意識自動裝箱
Integer i = 100; // 100是基本數據類型,而Interger是對象類型,這裏相當於通過Integer的構造器實例化了一個對象。 // 如果在一個運算的循環當中使用了對象類型,那麽自動裝箱拆箱就會導致實例化指數個多余的實例,這是相當可怕的
就如最簡單的單例模式一樣,我們試圖把對象進行復用來降低內存頻繁地消耗,但並不意味著我們在所有地方都要避免創建對象。
如果是簡單對象,可以提升程序的清晰性、簡潔性、功能性,何樂而不為呢?況且簡單對象的創建和回收代價也不高,尤其對現代的JVM來說。
那我們應當在什麽時候使用呢?
例如像數據庫連接池這樣復雜的對象,重用這些對象具有很大的意義,那麽我們應當使用。此外,我們應當避免創建多余的對象,如“去除重復創建的字符串實例”。
最後,還需要考慮的一個因素是,你復用的對象是否可變,如果變化非常頻繁的話,那復用的時候就需要考慮更復雜的設計,或者不復用。
1、避免創建不必要的對象