白話阿里巴巴Java開發手冊高級篇

不久前,阿里巴巴發佈了《阿里巴巴Java開發手冊》,總結了阿里巴巴內部實際項目開發過程中開發人員應該遵守的研發流程規範,這些流程規範在一定程度上能夠保證最終的項目交付質量,通過在時間中總結模式,並推廣給廣大開發人員,來避免研發人員在實踐中容易犯的錯誤,確保最終在大規模協作的項目中達成既定目標。

無獨有偶,筆者去年在公司裏負責升級和制定研發流程、設計模板、設計標準、代碼標準等規範,並在實際工作中進行了應用和推廣,收效頗豐,也總結了適合支付平臺的技術規範,由於阿里巴巴Java開發手冊本身定位爲規約和規範,語言簡單、精煉,沒有太多的解讀和示例,有些條款對於一般開發人員理解起來比較困難,本文藉着阿里巴巴發佈的Java開發手冊,詳細解讀Java平臺下開發規範和標準的制定和實施,強調那些在開發過程中需要重點關注的技術點,特別是解決某類已識別問題的模式和反模式。

異常處理
【強制】Java 類庫中定義的一類 RuntimeException 可以通過預先檢查進行規避,而不應該通過 catch 來處理,比如: IndexOutOfBoundsException,NullPointerException等等。

說明: 無法通過預檢查的異常除外,如在解析一個外部傳來的字符串形式數字時,通過 catch NumberFormatException 來實現。

正例: if (obj != null) {…}

反例: try { obj.method() } catch (NullPointerException e) {…}

白話:
    
判空是一個永恆的話題,只要你不確定變量是否爲空,都應該判空,否則後患無窮。 
---------------------------------------------------------------------------------------------------------------
【強制】異常不要用來做流程控制,條件控制,因爲異常的處理效率比條件分支低。

白話:
    
禁止使用異常來封裝業務邏輯,業務異常應該用錯誤碼來表示,系統異常則使用Java原生異常。

異常處理是通過異常表查詢來實現的,肯定沒有跳轉語句性能高。
---------------------------------------------------------------------------------------------------------------
【強制】對大段代碼進行 try-catch,這是不負責任的表現。catch 時請分清穩定代碼和非穩定代碼,穩定代碼指的是無論如何不會出錯的代碼。對於非穩定代碼的catch儘可能進行區分異常類型,再做對應的異常處理。

白話:
    
做事要直切主題,不能一概而論。

不能簡單的catch Throwable,然後打印日誌,這是不負責任的表現,應該有針對的抓住和處理異常。
---------------------------------------------------------------------------------------------------------------
【強制】捕獲異常是爲了處理它,不要捕獲了卻什麼都不處理而拋棄之,如果不想處理它,請 將該異常拋給它的調用者。最外層的業務使用者,必須處理異常,將其轉化爲用戶可以理解的內容。

白話:    

禁止喫掉異常,喫掉異常就是捕獲異常什麼都沒做,也沒拋出,這也是不負責任的表現。

是在不能處理的異常拋出去,但是得讓使用方知道這種情況,這是編程提供方契約的一種方式。
---------------------------------------------------------------------------------------------------------------
【強制】有 try 塊放到了事務代碼中,catch 異常後,如果需要回滾事務,一定要注意手動回滾事務。

白話:我們基本採用聲明式事務,出現異常需要回滾的情況,建議繼續拋出異常讓聲明式事務自動回滾,不建議代碼中手工控制事務。
---------------------------------------------------------------------------------------------------------------
【強制】finally 塊必須對資源對象、流對象進行關閉,有異常也要做 try-catch。 說明:如果 JDK7 及以上,可以使用 try-with-resources 方式。

白話:永恆的資源關閉原則。

---------------------------------------------------------------------------------------------------------------
【強制】不能在 finally 塊中使用 return,finally 塊中的 return 返回後方法結束執行,不會再執行 try 塊中的 return 語句。

白話:
   
確實會覆蓋try塊裏面的return語句。
    
思維不混亂的話,沒人會把return語句寫在finally語句裏。
---------------------------------------------------------------------------------------------------------------
【強制】捕獲異常與拋異常,必須是完全匹配,或者捕獲異常是拋異常的父類。

如果預期對方拋的是繡球,實際接到的是鉛球,就會產生意外情況。

白話:異常處理後,讓異常變得更小,而不是變大,大而化小,小而化了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章