本文主要講解阿里JAVA開發手冊中比較重要的設計規范,這些重要的設計規范有助于我們改進自己的代碼,提升系統的系統的性能。
曾經與一位從阿里出來的Java工程師一起工作過一段時間,他的技術說不上非常厲害,但是,他的代碼寫的的非常好,凡是他做的功能很少出現Bug。我就很好奇,于是經常向他請教一些代碼設計的原則,然后他告訴了我阿里Java手冊。并且,他將這個手冊進行了修改,也成為了我司Java程序員的開發手冊。這篇文章就讓我們看一看這個手冊中比較重要的原則。
代碼中的命名均不能以下劃線或美元符號開始,也不能以下劃線或美元符號結束。
反例:_name/__name/$name/name_/name$/name__
類型與中括號緊挨相連來表示數組。
正例:定義整形數組int[]arrayDemo;反例:在main參數中,使用Stringargs[]來定義。
POJO類中布爾類型變量都不要加is前綴,否則部分框架解析會引起序列化錯誤。
說明:表達是與否的值采用is_xxx的命名方式,所以,需要在設置從is_xxx到xxx的映射關系。
反例:定義為基本數據類型BooleanisDeleted的屬性,它的方法也是isDeleted(),RPC框架在反向解析的時候,“誤以為”對應的屬性名稱是deleted,導致屬性獲取不到,進而拋出異常。
在常量與變量的命名時,表示類型的名詞放在詞尾,以提升辨識度。
正例:startTime/workQueue/nameList/TERMINATED_THREAD_COUNT
反例:startedAt/QueueOfWork/listName/COUNT_TERMINATED_THREAD
接口類中的方法和屬性不要加任何修飾符號(public也不要加),保持代碼的簡潔性,并加上有效的Javadoc注釋。盡量不要在接口里定義變量,假如一定要定義變量,肯定是與接口方法相關,并且是整個應用的基礎常量。
正例:接口方法簽名voidcommit();
接口基礎常量StringCOMPANY="alibaba";
反例:接口方法定義publicabstractvoidf();
說明:JDK8中接口答應有默認實現,那么這個default方法,是對所有實現類都有價值的默認實現。
枚舉類名帶上Enum后綴,枚舉成員名稱需要全大寫,單詞間用下劃線隔開。
說明:枚舉其實就是尤其的類,域成員均為常量,且構造方法被默認強制是私有。
正例:枚舉名字為ProcessStatusEnum的成員名稱:SUCCESS/UNKNOWN_REASON。

各層命名規約:
A)Service/DAO層方法命名規約
1)獲取單個對象的方法用get做前綴。
2)獲取多個對象的方法用list做前綴,復數形式結尾如:listObjects。3)獲取統計值的方法用count做前綴。
4)插入的方法用save/insert做前綴。
5)刪除的方法用remove/delete做前綴。
6)修改的方法用update做前綴。
B)領域模型命名規約
1)數據對象:xxxDO,xxx即為數據表名。
2)數據傳輸對象:xxxDTO,xxx為業務領域相關的名稱。
3)展示對象:xxxVO,xxx一般為網頁名稱。
4)POJO是DO/DTO/BO/VO的統稱,禁止命名成xxxPOJO。
不答應任何魔法值(即未經預先定義的常量)直接出現在代碼中。

反例:Stringkey="Id#taobao_"+tradeId;
cache.put(key,value);
cache.put(key,value);
避免通過一個類的對象引用訪問此類的靜態變量或靜態方法,無謂增加編譯器解析成本,直接用類名來訪問即可。
相同參數類型,相同業務含義,才可以使用Java的可變參數,避免使用Object。
說明:可變參數必須放置在參數列表的很后。(提倡同學們盡量不用可變參數編程)
正例:publicListlistUsers(Stringtype,Long...ids){...}
所有整型包裝類對象之間值的比較,全部使用equals方法比較。
說明:對于Integervar=?在-128至127范圍內的賦值,Integer對象是在IntegerCache.cache產生,會復用已有對象,這個區間內的Integer值可以直接使用==進行判定,但是這個區間之外的所有數據,都會在堆上產生,并不會復用已有對象,這是一個大坑,推薦使用equals方法進行判定。
關于基本數據類型與包裝數據類型的使用標準如下:
1)【強制】所有的POJO類屬性必須使用包裝數據類型。
2)【強制】RPC方法的返回值和參數必須使用包裝數據類型。3)【推薦】所有的局部變量使用基本數據類型。
說明:POJO類屬性沒有初值是提醒使用者在需要使用時,必須自己顯式地進行賦值,任何NPE問題,或者入庫檢查,都由使用者來保證。
正例:數據庫的查詢結果可能是null,因為自動拆箱,用基本數據類型接收有NPE風險。
反例:比如顯示成交總額漲跌情況,即正負x%,x為基本數據類型,調用的RPC服務,調用不成功時,返回的是默認值,頁面顯示為0%,這是不合理的,應該顯示成中劃線。所以包裝數據類型的null值,能夠表示額外的信息,如:遠程調用失敗,異常退出。
POJO類必須寫toString方法。
使用IDE中的工具:source>generatetoString時,假如繼續了另一個POJO類,注重在前面加一下super.toString。
說明:在方法執行拋出異常時,可以直接調用POJO的toString()方法打印其屬性值,便于排查問題。
關于hashCode和equals的處理,遵循如下規則:
1)只要覆寫equals,就必須覆寫hashCode。
2)因為Set存儲的是不重復的對象,依據hashCode和equals進行判定,所以Set存儲的對象必須覆寫這兩個方法。
3)假如自定義對象作為Map的鍵,那么必須覆寫hashCode和equals。
說明:String已覆寫hashCode和equals方法,所以我們可以愉快地使用String對象作為key來使用。
線程資源必須通過線程池提供,不答應在應用中自行顯式創建線程。
說明:線程池的好處是減少在創建和銷毀線程上所消耗的時間以及系統資源的開銷,解決資源不足的問題。假如不使用線程池,有可能造成系統創建大量同類線程而導致消耗完內存或者“過度切換”的問題。
線程池不答應使用Executors去創建,而是通過ThreadPoolExecutor的方式,這樣的處理方式讓寫的同學更加明確線程池的運行規則,規避資源耗盡的風險。
以上規范在設計代碼中,是比較重要的原則。假如編寫代碼的過程中,可以依照以上原則,那代碼的可讀性和可維護性將大大提升
下一篇:淘寶直播吸引粉絲的途徑
文章地址:http://www.meyanliao.com/article/online/6557.html