碼出高效,阿里巴巴JAVA開發手冊1.4.0閱讀筆記java
1、編程規約
(三) 代碼格式
// 關鍵詞if與括號之間必須有一個空格,括號內的f與左括號,0與右括號不須要空格數據庫
if (flag == 0) { System.out.println(say); }
6. 【強制】註釋的雙斜線與內容之間有且僅一個空格。
正例: // 這是示例註釋,請注意在雙斜線以後有一個空格 String ygb = new String();編程
(四) OOP規約
1. 【強制】避免經過一個類的對象引用訪問此類的靜態變量或靜態方法,無謂增長編譯器解析成本,直接用類名來訪問便可。數組
2. 【強制】全部的覆寫方法,必須加@Override註解。 說明:getObject()與get0bject()的問題。一個是字母的O,一個是數字的0,加@Override能夠準確判斷是否覆蓋成功。另外,若是在抽象類中對方法簽名進行修改,其實現類會立刻編譯報錯。網絡
(五) 集合處理
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錯誤。ide
5. 【強制】使用工具類Arrays.asList()把數組轉換成集合時,不能使用其修改集合相關的方法,它的add/remove/clear方法會拋出UnsupportedOperationException異常。 說明:asList的返回對象是一個Arrays內部類,並無實現集合的修改方法。Arrays.asList體現的是適配器模式,只是轉換接口,後臺的數據還是數組。 String[] str = new String[] { "you", "wu" }; List list = Arrays.asList(str); 第一種狀況:list.add("yangguanbao"); 運行時異常。 第二種狀況:str[0] = "gujin"; 那麼list.get(0)也會隨之修改。高併發
7. 【強制】不要在foreach循環裏進行元素的remove/add操做。remove元素請使用Iterator方式,若是併發操做,須要對Iterator對象加鎖。
正例:工具
List<String> list = new ArrayList<>(); list.add("1"); list.add("2"); Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { String item = iterator.next(); if (刪除元素的條件) { iterator.remove(); } } 反例: for (String item : list) { if ("1".equals(item)) { list.remove(item); } }
說明:以上代碼的執行結果確定會出乎你們的意料,那麼試一下把「1」換成「2」,會是一樣的結果嗎?ui
11. 【推薦】使用entrySet遍歷Map類集合KV,而不是keySet方式進行遍歷。 說明:keySet實際上是遍歷了2次,一次是轉爲Iterator對象,另外一次是從hashMap中取出key所對應的value。而entrySet只是遍歷了一次就把key和value都放到了entry中,效率更高。若是是JDK8,使用Map.foreach方法。 正例:values()返回的是V值集合,是一個list集合對象;keySet()返回的是K值集合,是一個Set集合對象;entrySet()返回的是K-V值組合集合。
(七)控制語句
3.【強制】在高併發場景中,避免使用 」等於 」判斷做爲中或退出的條件。 判斷做爲中或退出的條件。 說明: 若是併發控制沒有處理好,容易產生等值判斷被 若是併發控制沒有處理好,容易產生等值判斷被 「擊穿 」的狀況,使用大於或小區間 的狀況,使用大於或小區間 的狀況,使用大於或小區間 的狀況,使用大於或小區間 判斷條件來代替。 反例: 判斷剩餘獎品數量等於 0時,終止發放獎品但由於並處理錯誤致使數量瞬間變 時,終止發放獎品但由於並處理錯誤致使數量瞬間變 時,終止發放獎品但由於並處理錯誤致使數量瞬間變 成了負數, 這樣的話,活動沒法終止。
4. 【推薦】表達異常的分支時,少用if-else方式,這種方式能夠改寫成:
if (condition) { ... return obj; } // 接着寫else的業務邏輯代碼;
說明:若是非得使用if()...else if()...else...方式表達邏輯,【強制】避免後續代碼維護困難,請勿超過3層。
正例:超過3層的 if-else 的邏輯判斷代碼可使用衛語句、策略模式、狀態模式等來實現,其中衛語句示例以下:
public void today() { if (isBusy()) { System.out.println(「change time.」); return; } if (isFree()) { System.out.println(「go to travel.」); return; } System.out.println(「stay at home to learn Alibaba Java Coding Guidelines.」); return; }
5. 【推薦】除經常使用方法(如getXxx/isXxx)等外,不要在條件判斷中執行其它複雜的語句,將複雜邏輯判斷的結果賦值給一個有意義的布爾變量名,以提升可讀性。 說明:不少if語句內的邏輯至關複雜,閱讀者須要分析條件表達式的最終結果,才能明確什麼樣的條件執行什麼樣的語句,那麼,若是閱讀者分析邏輯表達式錯誤呢? 正例:
// 僞代碼以下
final boolean existed = (file.open(fileName, "w") != null) && (...) || (...); if (existed) { ... } 反例: if ((file.open(fileName, "w") != null) && (...) || (...)) { ... }
(八) 註釋規約
1. 【強制】類、類屬性、類方法的註釋必須使用Javadoc規範,使用/**內容*/格式,不得使用// xxx方式。 說明:在IDE編輯窗口中,Javadoc方式會提示相關注釋,生成Javadoc能夠正確輸出相應註釋;在IDE中,工程調用方法時,不進入方法便可懸浮提示方法、參數、返回值的意義,提升閱讀效率。
3. 【強制】全部的類都必須添加建立者和建立日期。
4. 【強制】方法內部單行註釋,在被註釋語句上方另起一行,使用//註釋。方法內部多行註釋使用/* */註釋,注意與代碼對齊。
7. 【推薦】代碼修改的同時,註釋也要進行相應的修改,尤爲是參數、返回值、異常、核心邏輯等的修改。 說明:代碼與註釋更新不一樣步,就像路網與導航軟件更新不一樣步同樣,若是導航軟件嚴重滯後,就失去了導航的意義。
10. 【參考】好的命名、代碼結構是自解釋的,註釋力求精簡準確、表達到位。避免出現註釋的一個極端:過多過濫的註釋,代碼的邏輯一旦修改,修改註釋是至關大的負擔。 反例:
// put elephant into fridge
put(elephant, fridge);
方法名put,加上兩個有意義的變量名elephant和fridge,已經說明了這是在幹什麼,語義清晰的代碼不須要額外的註釋。
5、MySQL數據庫
(一) 建表規約
5. 【強制】主鍵索引名爲pk_字段名;惟一索引名爲uk_字段名;普通索引名則爲idx_字段名。 說明:pk_ 即primary key;uk_ 即 unique key;idx_ 即index的簡稱。
(三) SQL語句
7. 【強制】禁止使用存儲過程,存儲過程難以調試和擴展,更沒有移植性。
8. 【強制】數據訂正(特別是刪除、修改記錄操做)時,要先select,避免出現誤刪除,確認無誤才能執行更新語句。
(四) ORM映射
1. 【強制】在表查詢中,一概不要使用 * 做爲查詢的字段列表,須要哪些字段必須明確寫明。 說明:1)增長查詢分析器解析成本。2)增減字段容易與resultMap配置不一致。3)無用字段增長網絡消耗,尤爲是text類型的字段。
2. 【強制】POJO類的布爾屬性不能加is,而數據庫字段必須加is_,要求在resultMap中進行字段與屬性之間的映射。 說明:參見定義POJO類以及數據庫字段定義規定,在<resultMap>中增長映射,是必須的。在MyBatis Generator生成的代碼中,須要進行對應的修改。
7、設計規約14.【參考】系統設計主要目的是明確需求、理順邏輯、後期維護,次要目的用於指導編碼。 說明:避免爲了設計而設計,系統設計文檔有助於後期的系統維護,因此設計結果須要進行分類歸檔保存。