Java開發規範總結

 Service / DAO 層方法命名規約:java

1 ) 獲取單個對象的方法用 get 作前綴。
2 ) 獲取多個對象的方法用 list 作前綴。
3 ) 獲取統計值的方法用 count 作前綴。
4 ) 插入的方法用 save( 推薦 ) 或 insert 作前綴。
5 ) 刪除的方法用 remove( 推薦 ) 或 delete 作前綴。
6 ) 修改的方法用 update 作前綴。
 領域模型命名規約:
1 ) 數據對象: xxxDO , xxx 即爲數據表名。
2 ) 數據傳輸對象: xxxDTO , xxx 爲業務領域相關的名稱。
3 ) 展現對象: xxxVO , xxx 通常爲網頁名稱。
4 ) POJO 是 DO / DTO / BO / VO 的統稱,禁止命名成 xxxPOJO 。編程

常量定義:數組

1)不容許任何魔法值 ( 即未經定義的常量 ) 直接出如今代碼中。反例: String key = " Id # taobao _" + tradeId緩存

2)不要使用一個常量類維護全部常量,應該按常量功能進行歸類,分開維護。如:緩存相關的常量放在類: CacheConsts 下 ; 系統配置相關的常量放在類: ConfigConsts 下。說明:大而全的常量類,非得使用查找功能才能定位到修改的常量,不利於理解和維護。安全

3)若是變量值僅在一個範圍內變化,且帶有名稱以外的延伸屬性,定義爲枚舉類。下面正例中的數字就是延伸信息,表示星期幾。正例: public Enum { MONDAY(1), TUESDAY(2), WEDNESDAY(3), THURSDAY(4), FRIDAY(5), SATURDAY(6),SUNDAY(7);}併發

代碼格式:app

1) 左小括號和字符之間不出現空格 ; 一樣,右小括號和字符之間也不出現空格。詳見第 5 條下方正例提示。反例: if (空格 a == b 空格) dom

2) if / for / while / switch / do 等保留字與括號之間都必須加空格。ide

3) 任何二目、三目運算符的左右兩邊都須要加一個空格說明:運算符包括賦值運算符=、邏輯運算符&&、加減乘除符號等工具

4) 單行字符數限制不超過 120 個,超出須要換行,換行時遵循以下原則:

     1) 第二行相對第一行縮進 4 個空格,從第三行開始,再也不繼續縮進,參考示例。
     2 ) 運算符與下文一塊兒換行。
     3 ) 方法調用的點符號與下文一塊兒換行。
     4 ) 在多個參數超長,在逗號後換行。
     5 ) 在括號前不要換行,見反例。
正例:
StringBuffer sb = new StringBuffer();
//超過 120 個字符的狀況下,換行縮進 4 個空格,而且方法前的點符號一塊兒換行
sb.append("zi").append("xin")...
.append("huang")...
.append("huang")...
.append("huang");

5) 方法參數在定義和傳入時,多個參數逗號後邊必須加空格。正例:下例中實參的" a ",後邊必需要有一個空格。method("a", "b", "c");

OOP約束:

 1) 避免經過一個類的對象引用訪問此類的靜態變量或靜態方法,無謂增長編譯器解析成本,直接用類名來訪問便可。

 2) 全部的覆寫方法,必須加@ Override 註解。說明: getObject() 與 get 0 bject() 的問題。一個是字母的 O ,一個是數字的 0,加@ Override能夠準確判斷是否覆蓋成功。另外,若是在抽象類中對方法簽名進行修改,其實現類會立刻編譯報錯。

3)相同參數類型,相同業務含義,纔可使用 Java 的可變參數,避免使用 Object 。說明:可變參數必須放置在參數列表的最後。 ( 提倡同窗們儘可能不用可變參數編程 )正例: public User getUsers(String type, Integer... ids) {...}

4)Object 的 equals 方法容易拋空指針異常,應使用常量或肯定有值的對象來調用equals 。正例: " test " .equals(object);反例:  object.equals( " test " );說明:推薦使用 java . util . Objects # equals (JDK 7 引入的工具類 )

5)  關於基本數據類型與包裝數據類型的使用標準以下:【強制】全部的 POJO 類屬性必須使用包裝數據類型。【強制】 RPC 方法的返回值和參數必須使用包裝數據類型。【推薦】全部的局部變量使用基本數據類型。

6) 【推薦】循環體內,字符串的鏈接方式,使用 StringBuilder 的 append 方法進行擴展。

說明:反編譯出的字節碼文件顯示每次循環都會 new 出一個 StringBuilder 對象,而後進行
append 操做,最後經過 toString 方法返回 String 對象,形成內存資源浪費。
反例:
String str = "start";
for (int i = 0; i < 100; i++) {
str = str + "hello";
}

集合處理:

1. 【強制】關於 hashCode 和 equals 的處理,遵循以下規則:1) 只要重寫 equals ,就必須重寫 hashCode 。2) 由於 Set 存儲的是不重複的對象,依據 hashCode 和 equals 進行判斷,因此 Set 存儲的對象必須重寫這兩個方法。3) 若是自定義對象作爲 Map 的鍵,那麼必須重寫 hashCode 和 equals 。說明: String 重寫了 hashCode 和 equals 方法,因此咱們能夠很是愉快地使用 String 對象做爲 key 來使用。2. 【強制】 ArrayList 的 subList 結果不可強轉成 ArrayList ,不然會拋出 ClassCastException異常: java . util . RandomAccessSubList cannot be cast to java . util . ArrayList ; 說明: subList 返回的是 ArrayList 的內部類 SubList ,並非 ArrayList ,而是ArrayList 的一個視圖,對於 SubList 子列表的全部操做最終會反映到原列表上。3. 【強制】 在 subList 場景中,高度注意對原集合元素個數的修改,會致使子列表的遍歷、增長、刪除均產生 ConcurrentModificationException 異常。4. 【強制】使用集合轉數組的方法,必須使用集合的 toArray(T[] array) ,傳入的是類型徹底同樣的數組,大小就是 list . size() 。說明:使用 toArray 帶參方法,入參分配的數組空間不夠大時, toArray 方法內部將從新分配內存空間,並返回新數組地址 ; 若是數組元素大於實際所需,下標爲 [ list . size() ] 的數組元素將被置爲 null ,其它數組元素保持原值,所以最好將方法入參數組大小定義與集合元素個數一致。正例:List<String> list = new ArrayList<String>(2);list.add("guan");list.add("bao");String[] array = new String[list.size()];array = list.toArray(array);反例:直接使用 toArray 無參方法存在問題,此方法返回值只能是 Object[] 類,若強轉其它類型數組將出現 ClassCastException 錯誤。5. 【強制】使用工具類 Arrays . asList() 把數組轉換成集合時,不能使用其修改集合相關的方法,它的 add / remove / clear 方法會拋出 UnsupportedOperationException 異常。說明: asList 的返回對象是一個 Arrays 內部類,並無實現集合的修改方法。 Arrays . asList體現的是適配器模式,只是轉換接口,後臺的數據還是數組。String[] str = new String[] { "a", "b" };List list = Arrays.asList(str);第一種狀況: list.add("c"); 運行時異常。第二種狀況: str[0] = "gujin"; 那麼 list.get(0) 也會隨之修改。6. 【強制】泛型通配符<? extends T >來接收返回的數據,此寫法的泛型集合不能使用 add 方法,而 <? super T> 不能使用 get 方法,作爲接口調用賦值時易出錯。說明:擴展說一下 PECS(Producer Extends Consumer Super) 原則:1)頻繁往外讀取內容的,適合用上界 Extends 。2)常常往裏插入的,適合用下界 Super 。7. 【強制】不要在 foreach 循環裏進行元素的 remove / add 操做。 remove 元素請使用 Iterator方式,若是併發操做,須要對 Iterator 對象加鎖。正例:Iterator<String> it = a.iterator();while (it.hasNext()) {String temp = it.next();if (刪除元素的條件) {it.remove();}}反例:List<String> a = new ArrayList<String>();a.add("1");a.add("2");for (String temp : a) {if ("1".equals(temp)) {a.remove(temp);}}說明:以上代碼的執行結果確定會出乎你們的意料,那麼試一下把「1」換成「2」,會是一樣的結果嗎?8. 【強制】 在 JDK 7 版本及以上, Comparator 要知足以下三個條件,否則 Arrays . sort ,Collections . sort 會報 IllegalArgumentException 異常。說明:1 ) x , y 的比較結果和 y , x 的比較結果相反。2 ) x > y , y > z ,則 x > z 。3 ) x = y ,則 x , z 比較結果和 y , z 比較結果相同。反例:下例中沒有處理相等的狀況,實際使用中可能會出現異常:new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {return o1.getId() > o2.getId() ? 1 : -1;}};9. 【推薦】集合初始化時,指定集合初始值大小。說明: HashMap 使用 HashMap(int initialCapacity) 初始化,正例: initialCapacity = (須要存儲的元素個數 / 負載因子) + 1。注意負載因子(即loaderfactor)默認爲 0.75, 若是暫時沒法肯定初始值大小,請設置爲 16。反例: HashMap 須要放置 1024 個元素,因爲沒有設置容量初始大小,隨着元素不斷增長,容量 7 次被迫擴大, resize 須要重建 hash 表,嚴重影響性能。10. 【推薦】使用 entrySet 遍歷 Map 類集合 KV ,而不是 keySet 方式進行遍歷。說明: keySet 實際上是遍歷了 2 次,一次是轉爲 Iterator 對象,另外一次是從 hashMap 中取出key 所對應的 value 。而 entrySet 只是遍歷了一次就把 key 和 value 都放到了 entry 中,效率更高。若是是 JDK 8,使用 Map . foreach 方法。正例: values() 返回的是 V 值集合,是一個 list 集合對象 ;keySet() 返回的是 K 值集合,是一個 Set 集合對象 ;entrySet() 返回的是 K - V 值組合集合。11. 【推薦】高度注意 Map 類集合 K / V 能不能存儲 null 值的狀況,以下表格:集合類 集合類 Key Value Super 說明 說明Hashtable 不容許爲 null 不容許爲 null Dictionary 線程安全ConcurrentHashMap 不容許爲 null 不容許爲 null AbstractMap 分段鎖技術TreeMap 不容許爲 null 容許爲 null AbstractMap 線程不安全HashMap 容許爲 null 容許爲 null AbstractMap 線程不安全反例: 因爲 HashMap 的干擾,不少人認爲 ConcurrentHashMap 是能夠置入 null 值,而事實上,存儲 null 值時會拋出 NPE 異常。12. 【參考】合理利用好集合的有序性 (sort) 和穩定性 (order) ,避免集合的無序性 (unsort) 和不穩定性 (unorder) 帶來的負面影響。說明:有序性是指遍歷的結果是按某種比較規則依次排列的。穩定性指集合每次遍歷的元素次序是必定的。如: ArrayList 是 order / unsort;HashMap 是 unorder / unsort;TreeSet 是order / sort 。13. 【參考】利用 Set 元素惟一的特性,能夠快速對一個集合進行去重操做,避免使用 List 的contains 方法進行遍歷、對比、去重操做。

相關文章
相關標籤/搜索