Java開發規範總結

來源:互聯網
上載者:User

標籤:ica   枚舉   調用   變化   位元組   current   地址   問題   hashcode   

 Service / DAO 層方法命名規約:

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);}

代碼格式:

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

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

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 方法容易拋null 指標異常,應使用常量或確定有值的對象來調用equals 。正例: " test " .equals(object);反例:  object.equals( " test " );說明:推薦使用 java . util . Objects # equals (JDK 7 引入的工具類 )

5)  關於基礎資料型別 (Elementary Data Type)與封裝資料類型的使用標準如下:【強制】所有的 POJO 類屬性必須使用封裝資料類型。【強制】 RPC 方法的傳回值和參數必須使用封裝資料類型。【推薦】所有的局部變數使用基礎資料型別 (Elementary Data Type)。

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>() {
@Override
public int compare(Student o1, Student o2) {
return o1.getId() > o2.getId() ? 1 : -1;
}
};
9. 【推薦】集合初始化時,指定集合初始值大小。說明: HashMap 使用 HashMap(int initialCapacity) 初始化,正例: initialCapacity = (需要儲存的元素個數 / 負載因子) + 1。注意負載因子(即loader
factor)預設為 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 方法進行遍曆、對比、去重操作。

Java開發規範總結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.