1. 如何使用Exception
Exception降低效能。一個異常拋出首先需要建立一個新的對象。Throwable介面中的構造器調用名為 fillInStackTrace()的本地方法。這個方法負責巡檢棧的整個架構來收集跟蹤資訊。這樣無論何時有異常 拋出,它要求虛擬機器裝載調用棧,因為一個新的對象在中部被建立。
異常應當僅用於有錯誤發生時,而不要控制流程。
2. 不要兩次初始設定變數
Java通過調用獨特的類構造器預設地初始設定變數為一個已知的值。所有的對象被設定成null, integers (byte, short, int, long)被設定成0,float和double設定成0.0,Boolean變數設定成false。 這對那些擴充自其它類的類尤其重要,這跟使用一個新的關鍵詞建立一個對象時所有一連串的構造器被自 動調用一樣。
3. 在任何可能的地方讓類為Final
標記為final的類不能被擴充。在《核心Java API》中有大量這個技術的例子,諸如java.lang.String 。將String類標記為final阻止了開發人員建立他們自己實現的長度方法。
更深入點說,如果類是final的,所有類的方法也是final的。Java編譯器可能會內聯所有的方法(這 依賴於編譯器的實現)。在我的測試裡,我已經看到效能平均增加了50%。
4. 在任何可能的地方使用局部變數
屬於方法調用部分的自變數和聲明為此調用一部分的臨時變數儲存在棧中,這比較快。諸如static, 執行個體(instance)變數和新的對象建立在堆中,這比較慢。局部變數的更深入最佳化依賴於你正在使用的編 譯器或虛擬機器。
5. 停止小聰明
很多開發人員在腦子中編寫可複用和靈活的代碼,而有時候在他們的程式中就產生額外的開銷。曾經 或者另外的時候他們編寫了類似這樣的代碼:
public void doSomething(File file) {
FileInputStream fileIn = new FileInputStream(file);
// do something
他夠靈活,但是同時他們也產生了更多的開銷。這個主意背後做的事情是操縱一個InputStream,而不 是一個檔案,因此它應該重寫如下:
public void doSomething(InputStream inputStream){
// do something