1. 程式人生 > >Java開發小技巧

Java開發小技巧

(1) 使用Integer.valueOf()代替new Integer();

(2) if (result.size() > 0) return true;

  return false;

  可以優化為return return result.size()>0  

(3) 使用"const".eqauls(variable)代替 variable.eqauls("const") 避免null point exception

(4) 在使用字串的拼接的時候,建議使用StringBuffer代替String

(5) 在進行資料庫操作的時候用PreparedStatement代替Statement,可以避免因為引號過多而引起的錯誤

(6) 在進行復雜查詢語句的拼接的時候,建議加上"where 1=1",當然在不考慮資料庫的效能.

(7)try{}catch(Exception e){} finally{if(conn!=null){conn.colse();conn==null}}在使用資料庫操作的

時候儘量多用finally語句,進行資源的釋放。

(8) 在進行多異常捕獲的時候,最後建議加上Exception異常做沒有考慮到的異常捕獲,比如

try{}catch(OtherException e){}catch(Exception e){} finally{if(conn!=null){conn.colse();conn==null}}

(9) 給每個if(condition){}都加上大括號,即使裡面只有一句話,加強程式的可讀性

(10)能用常量的東西都要用常量來完成,避免使用硬編碼,增加可維護性質。比如少用 String str = "123"

使用private static final CONST = "123" ; String str = CONST;

(11) 定義的靜態的常量用全大寫,方法名開頭用小寫,類名用大寫。在bean中定義的變數名用小寫,並且所有的名字

命名要體現出業務的特性。呵呵,這裡說到了規範。。。

(12) 多看看Apache下的一些Utils包吧!方便實用,必備工具!

(13) 可以用for(int i= list.size();i>0;i--;)去代替for(int i = 0;i <list.size();i++) 這樣可以提高程式的執行速度:

(14) 寫註釋有助於寫出邏輯清晰的程式碼

(15) 用字元分隔多字串時,為了防止字串中有設定的分隔符,我採用如下字元進行分隔 (c#的,JAVA也差不多) 

char char2 = '\x0012'; string strreg = ""; strreg += char2;   

(16) 一個數據有很多屬性時,可以用反射取出所有屬性,在製作HTML表單時,這個方法非常爽 

(17) 在表單取值的時候,多使用String A = B.trim();來去空格

(18) 用isEmpty()代替equels("");

(19) 把某非String型別轉換成String型別的,大多用.toString(); 但可以用String.valueof(...);

(20) 內部類愛好者 + 匿名內部類狂熱分子

(21) 類名首字母應該大寫。欄位、方法以及物件(控制代碼)的首字母應小寫。對於所有識別符號,其中包含的所有單詞都應緊靠在一起,而且大寫中間單詞的首字母。例如: 

ThisIsAClassName 

thisIsMethodOrFieldName 

若在定義中出現了常數初始化字元,則大寫static final基本型別識別符號中的所有字母。這樣便可標誌出它們屬於編譯期的常數。 

Java包(Package)屬於一種特殊情況:它們全都是小寫字母,即便中間的單詞亦是如此。對於域名副檔名稱,如com,org,net或者edu等,全部都應小寫(這也是Java 1.1和Java 1.2的區別之一)。 

(22) 為了常規用途而建立一個類時,請採取"經典形式",幷包含對下述元素的定義: 

equals() 

hashCode() 

toString() 

clone()(implement Cloneable) 

implement Serializable 

(23) 對於自己建立的每一個類,都考慮置入一個main(),其中包含了用於測試那個類的程式碼。為使用一個專案中的類,我們沒必要刪除測試程式碼。若進行了任何形式的改動,可方便地返回測試。這些程式碼也可作為如何使用類的一個示例使用。 

(24) 應將方法設計成簡要的、功能性單元,用它描述和實現一個不連續的類介面部分。理想情況下,方法應簡明扼要。若長度很大,可考慮通過某種方式將其分割成較短的幾個方法。這樣做也便於類內程式碼的重複使用(有些時候,方法必須非常大,但它們仍應只做同樣的一件事情)。 

 (25) 設計一個類時,請設身處地為客戶程式設計師考慮一下(類的使用方法應該是非常明確的)。然後,再設身處地為管理程式碼的人考慮一下(預計有可能進行哪些形式的修改,想想用什麼方法可把它們變得更簡單)。 

(26) 使類儘可能短小精悍,而且只解決一個特定的問題。下面是對類設計的一些建議: 

■一個複雜的開關語句:考慮採用"多形"機制 

■數量眾多的方法涉及到型別差別極大的操作:考慮用幾個類來分別實現 

■許多成員變數在特徵上有很大的差別:考慮使用幾個類 

(27) 讓一切東西都儘可能地"私有"--private。可使庫的某一部分"公共化"(一個方法、類或者一個欄位等等),就永遠不能把它拿出。若強行拿出,就可能破壞其他人現有的程式碼,使他們不得不重新編寫和設計。若只公佈自己必須公佈的,就可放心大膽地改變其他任何東西。在多執行緒環境中,隱私是特別重要的一個因素--只有private欄位才能在非同步使用的情況下受到保護。 

(28) 謹惕"巨大物件綜合症"。對一些習慣於順序程式設計思維、且初涉OOP領域的新手,往往喜歡先寫一個順序執行的程式,再把它嵌入一個或兩個巨大的物件裡。根據程式設計原理,物件表達的應該是應用程式的概念,而非應用程式本身。 

(29) 若不得已進行一些不太雅觀的程式設計,至少應該把那些程式碼置於一個類的內部。 

(30) 任何時候只要發現類與類之間結合得非常緊密,就需要考慮是否採用內部類,從而改善編碼及維護工作  

(31) 儘可能細緻地加上註釋,並用javadoc註釋文件語法生成自己的程式文件。 

(32) 避免使用"魔術數字",這些數字很難與程式碼很好地配合。如以後需要修改它,無疑會成為一場噩夢,因為根本不知道"100"到底是指"陣列大小"還是"其他全然不同的東西"。所以,我們應建立一個常數,併為其使用具有說服力的描述性名稱,並在整個程式中都採用常數識別符號。這樣可使程式更易理解以及更易維護。 

(33) 涉及構建器和異常的時候,通常希望重新丟棄在構建器中捕獲的任何異常--如果它造成了那個物件的建立失敗。這樣一來,呼叫者就不會以為那個物件已正確地建立,從而盲目地繼續。 

(34) 當客戶程式設計師用完物件以後,若你的類要求進行任何清除工作,可考慮將清除程式碼置於一個良好定義的方法裡,採用類似於cleanup()這樣的名字,明確表明自己的用途。除此以外,可在類內放置一個boolean(布林)標記,指出物件是否已被清除。在類的finalize()方法裡,請確定物件已被清除,並已丟棄了從RuntimeException繼承的一個類(如果還沒有的話),從而指出一個程式設計錯誤。在採取象這樣的方案之前,請確定finalize()能夠在自己的系統中工作(可能需要呼叫System.runFinalizersOnExit(true),從而確保這一行為)。 

(35) 在一個特定的作用域內,若一個物件必須清除(非由垃圾收集機制處理),請採用下述方法:初始化物件;若成功,則立即進入一個含有finally從句的try塊,開始清除工作。 

 (36) 若在初始化過程中需要覆蓋(取消)finalize(),請記住呼叫super.finalize()(若Object屬於我們的直接超類,則無此必要)。在對finalize()進行覆蓋的過程中,對super.finalize()的呼叫應屬於最後一個行動,而不應是第一個行動,這樣可確保在需要基礎類元件的時候它們依然有效。 

(37) 建立大小固定的物件集合時,請將它們傳輸至一個數組(若準備從一個方法裡返回這個集合,更應如此操作)。這樣一來,我們就可享受到陣列在編譯期進行型別檢查的好處。此外,為使用它們,陣列的接收者也許並不需要將物件"造型"到數組裡。 

(38) 儘量使用interfaces,不要使用abstract類。若已知某樣東西準備成為一個基礎類,那麼第一個選擇應是將其變成一個interface(介面)。只有在不得不使用方法定義或者成員變數的時候,才需要將其變成一個abstract(抽象)類。介面主要描述了客戶希望做什麼事情,而一個類則致力於(或允許)具體的實施細節。 

(39) 在構建器內部,只進行那些將物件設為正確狀態所需的工作。儘可能地避免呼叫其他方法,因為那些方法可能被其他人覆蓋或取消,從而在構建過程中產生不可預知的結果

(40) 物件不應只是簡單地容納一些資料;它們的行為也應得到良好的定義。 

(41) 在現成類的基礎上建立新類時,請首先選擇"新建"或"創作"。只有自己的設計要求必須繼承時,才應考慮這方面的問題。若在本來允許新建的場合使用了繼承,則整個設計會變得沒有必要地複雜。 

(42) 用繼承及方法覆蓋來表示行為間的差異,而用欄位表示狀態間的區別。一個非常極端的例子是通過對不同類的繼承來表示顏色,這是絕對應該避免的:應直接使用一個"顏色"欄位。 

(43) 為避免程式設計時遇到麻煩,請保證在自己類路徑指到的任何地方,每個名字都僅對應一個類。否則,編譯器可能先找到同名的另一個類,並報告出錯訊息。若懷疑自己碰到了類路徑問題,請試試在類路徑的每一個起點,搜尋一下同名的.class檔案。 

(44) 在Java 1.1 AWT中使用事件"介面卡"時,特別容易碰到一個陷阱。若覆蓋了某個介面卡方法,同時拼寫方法沒有特別講究,最後的結果就是新新增一個方法,而不是覆蓋現成方法。然而,由於這樣做是完全合法的,所以不會從編譯器或執行期系統獲得任何出錯提示--只不過程式碼的工作就變得不正常了。 

(45) 用合理的設計方案消除"偽功能"。也就是說,假若只需要建立類的一個物件,就不要提前限制自己使用應用程式,並加上一條"只生成其中一個"註釋。請考慮將其封裝成一個"獨生子"的形式。若在主程式裡有大量散亂的程式碼,用於建立自己的物件,請考慮採納一種創造性的方案,將些程式碼封裝起來。 

 (46) 警惕"分析癱瘓"。請記住,無論如何都要提前瞭解整個專案的狀況,再去考察其中的細節。由於把握了全域性,可快速認識自己未知的一些因素,防止在考察細節的時候陷入"死邏輯"中。 

(47) 警惕"過早優化"。首先讓它執行起來,再考慮變得更快--但只有在自己必須這樣做、而且經證實在某部分程式碼中的確存在一個性能瓶頸的時候,才應進行優化。除非用專門的工具分析瓶頸,否則很有可能是在浪費自己的時間。效能提升的隱含代價是自己的程式碼變得難於理解,而且難於維護。 

(48) 請記住,閱讀程式碼的時間比寫程式碼的時間多得多。思路清晰的設計可獲得易於理解的程式,但註釋、細緻的解釋以及一些示例往往具有不可估量的價值。無論對你自己,還是對後來的人,它們都是相當重要的。如對此仍有懷疑,那麼請試想自己試圖從聯機Java文件裡找出有用資訊時碰到的挫折,這樣或許能將你說服。 

(49) 如認為自己已進行了良好的分析、設計或者實施,那麼請稍微更換一下思維角度。試試邀請一些外來人士--並不一定是專家,但可以是來自本公司其他部門的人。請他們用完全新鮮的眼光考察你的工作,看看是否能找出你一度熟視無睹的問題。採取這種方式,往往能在最適合修改的階段找出一些關鍵性的問題,避免產品發行後再解決問題而造成的金錢及精力方面的損失。 

(50) 良好的設計能帶來最大的回報。堅持抵制草草完工的誘惑--那樣做往往得不償失 

■字串的開銷:字串連線運算子+看似簡單,但實際需要消耗大量系統資源。編譯器可高效地連線字串,但變數字串卻要求可觀的處理器時間。例如,假設s和t是字串變數:
System.out.println("heading" + s + "trailer" + t);
上述語句要求新建一個StringBuffer(字串緩衝),追加自變數,然後用toString()將結果轉換回一個字串。因此,無論磁碟空間還是處理器時間,都會受到嚴重消耗。若準備追加多個字串,則可考慮直接使用一個字串緩衝——特別是能在一個迴圈裡重複利用它的時候。通過在每次迴圈裡禁止新建一個字串緩衝,可節省980單位的物件建立時間(如前所述)。利用substring()以及其他字串方法,可進一步地改善效能。如果可行,字元陣列的速度甚至能夠更快。也要注意由於同步的關係,所以StringTokenizer會造成較大的開銷。
■同步:在JDK直譯器中,呼叫同步方法通常會比呼叫不同步方法慢10倍。經JIT編譯器處理後,這一效能上的差距提升到50到100倍(注意前表總結的時間顯示出要慢97倍)。所以要儘可能避免使用同步方法——若不能避免,方法的同步也要比程式碼塊的同步稍快一些。
■重複利用物件:要花很長的時間來新建一個物件(根據前表總結的時間,物件的新建時間是賦值時間的980倍,而新建一個小陣列的時間是賦值時間的3100倍)。因此,最明智的做法是儲存和更新老物件的欄位,而不是建立一個新物件。例如,不要在自己的paint()方法中新建一個Font物件。相反,應將其宣告成例項物件,再初始化一次。在這以後,可在paint()裡需要的時候隨時進行更新。參見Bentley編著的《程式設計拾貝》,p.81[15]。
■異常:只有在不正常的情況下,才應放棄異常處理模組。什麼才叫“不正常”呢?這通常是指程式遇到了問題,而這一般是不願見到的,所以效能不再成為優先考慮的目標。進行優化時,將小的“try-catch”塊合併到一起。由於這些塊將程式碼分割成小的、各自獨立的片斷,所以會妨礙編譯器進行優化。另一方面,若過份熱衷於刪除異常處理模組,也可能造成程式碼健壯程度的下降。
■雜湊處理:首先,Java 1.0和1.1的標準“散列表”(Hashtable)類需要造型以及特別消耗系統資源的同步處理(570單位的賦值時間)。其次,早期的JDK庫不能自動決定最佳的表格尺寸。最後,雜湊函式應針對實際使用項(Key)的特徵設計。考慮到所有這些原因,我們可特別設計一個雜湊類,令其與特定的應用程式配合,從而改善常規散列表的效能。注意Java 1.2集合庫的雜湊對映(HashMap)具有更大的靈活性,而且不會自動同步。
■方法內嵌:只有在方法屬於final(最終)、private(專用)或static(靜態)的情況下,Java編譯器才能內嵌這個方法。而且某些情況下,還要求它絕對不可以有區域性變數。若程式碼花大量時間呼叫一個不含上述任何屬性的方法,那麼請考慮為其編寫一個“final”版本。
■I/O:應儘可能使用緩衝。否則,最終也許就是一次僅輸入/輸出一個位元組的惡果。注意JDK 1.0的I/O類採用了大量同步措施,所以若使用象readFully()這樣的一個“大批量”呼叫,然後由自己解釋資料,就可獲得更佳的效能。也要注意Java 1.1的“reader”和“writer”類已針對性能進行了優化。
■造型和例項:造型會耗去2到200個單位的賦值時間。開銷更大的甚至要求上溯繼承(遺傳)結構。其他高代價的操作會損失和恢復更低層結構的能力。
■圖形:利用剪下技術,減少在repaint()中的工作量;倍增緩衝區,提高接收速度;同時利用圖形壓縮技術,縮短下載時間。來自JavaWorld的“Java Applets”以及來自Sun的“Performing Animation”是兩個很好的教程。請記著使用最貼切的命令。例如,為根據一系列點畫一個多邊形,和drawLine()相比,drawPolygon()的速度要快得多。如必須畫一條單畫素粗細的直線,drawLine(x,y,x,y)的速度比fillRect(x,y,1,1)快。
■使用API類:儘量使用來自Java API的類,因為它們本身已針對機器的效能進行了優化。這是用Java難於達到的。比如在複製任意長度的一個數組時,arraryCopy()比使用迴圈的速度快得多。
■替換API類:有些時候,API類提供了比我們希望更多的功能,相應的執行時間也會增加。因此,可定做特別的版本,讓它做更少的事情,但可更快地執行。例如,假定一個應用程式需要一個容器來儲存大量陣列。為加快執行速度,可將原來的Vector(向量)替換成更快的動態物件陣列。

1. 其他建議
■將重複的常數計算移至關鍵迴圈之外——比如計算固定長度緩衝區的buffer.length。
■static final(靜態最終)常數有助於編譯器優化程式。
■實現固定長度的迴圈。
■使用javac的優化選項:-O。它通過內嵌static,final以及private方法,從而優化編譯過的程式碼。注意類的長度可能會增加(只對JDK 1.1而言——更早的版本也許不能執行位元組查證)。新型的“Just-in-time”(JIT)編譯器會動態加速程式碼。
■儘可能地將計數減至0——這使用了一個特殊的JVM位元組碼。