參考:阿里巴巴Java開發手冊V1.3.0java
總結比較重要的,對面試有用的開發規約linux
反例:定義爲基本數據類型 Boolean isDeleted;的屬性,它的方法也是 isDeleted(),RPC 框架在反向解析的時候,「覺得」對應的屬性名稱是 deleted,致使屬性獲取不到,進而拋出異常。git
public class OrderFactory;程序員
public class LoginProxy;github
public class ResourceObserver;面試
反例:String key = "Id#taobao_" + tradeId;正則表達式
cache.put(key, value);算法
正例:public Enum { MONDAY(1), TUESDAY(2), WEDNESDAY(3), THURSDAY(4), FRIDAY(5), SATURDAY(6), SUNDAY(7);}數據庫
【強制】避免經過一個類的對象引用訪問此類的靜態變量或靜態方法,無謂增長編譯器解析成本,直接用類名來訪問便可。編程
【強制】外部正在調用或者二方庫依賴的接口,不容許修改方法簽名,避免對接口調用方產生影響。接口過期必須加@Deprecated 註解,並清晰地說明採用的新接口或者新服務是什麼。
【強制】全部的相同類型的包裝類對象之間值的比較,所有使用 equals 方法比較。
說明:對於 Integer var = ? 在-128 至 127 範圍內的賦值,Integer 對象是在IntegerCache.cache 產生,會複用已有對象,這個區間內的 Integer值能夠直接使用==進行判斷,可是這個區間以外的全部數據,都會在堆上產生,並不會複用已有對象,這是一個大坑,推薦使用 equals 方法進行判斷。
說明:注意 serialVersionUID 不一致會拋出序列化運行時異常。
【強制】構造方法裏面禁止加入任何業務邏輯,若是有初始化邏輯,請放在 init 方法中。
【強制】POJO 類必須寫 toString 方法。使用 IDE 的中工具:source> generate toString 時,若是繼承了另外一個 POJO 類,注意在前面加一下 super.toString。
說明:在方法執行拋出異常時,能夠直接調用 POJO 的 toString()方法打印其屬性值,便於排 查問題。
說明:反編譯出的字節碼文件顯示每次循環都會 new 出一個 StringBuilder 對象,而後進行 append 操做,最後經過 toString 方法返回 String 對象,形成內存資源浪費。
反例:
String str = "start";
for (int i = 0; i < 100; i++) {
str = str + "hello";
}
複製代碼
說明:String 重寫了 hashCode 和 equals 方法,因此咱們能夠很是愉快地使用 String 對象 做爲 key 來使用。
說明:subList 返回的是 ArrayList 的內部類 SubList,並非 ArrayList ,而是 ArrayList 的一個視圖,對於 SubList 子列表的全部操做最終會反映到原列表上。
反例:直接使用 toArray 無參方法存在問題,此方法返回值只能是 Object[]類,若強轉其它 類型數組將出現 ClassCastException 錯誤。
說明:asList 的返回對象是一個 Arrays 內部類,並無實現集合的修改方法。Arrays.asList 體現的是適配器模式,只是轉換接口,後臺的數據還是數組。 String[] str = new String[] { "you", "wu" }; List list = Arrays.asList(str);
第一種狀況:list.add("yangguanbao"); 運行時異常。
第二種狀況:str[0] = "gujin"; 那麼 list.get(0)也會隨之修改。
【強制】不要在 foreach 循環裏進行元素的 remove/add 操做。remove 元素請使用 Iterator方式,若是併發操做,須要對 Iterator 對象加鎖。
【推薦】高度注意 Map 類集合 K/V 能不能存儲 null 值的狀況,以下表格:
說明:使用線程池的好處是減小在建立和銷燬線程上所花的時間以及系統資源的開銷,解決資 源不足的問題。若是不使用線程池,有可能形成系統建立大量同類線程而致使消耗完內存或者 「過分切換」的問題。
【強制】線程池不容許使用 Executors 去建立,而是經過 ThreadPoolExecutor 的方式,這樣的處理方式讓寫的同窗更加明確線程池的運行規則,規避資源耗盡的風險。
【推薦】避免 Random 實例被多線程使用,雖然共享該實例是線程安全的,但會因競爭同一seed 致使的性能降低。
說明:Random 實例包括 java.util.Random 的實例或者 Math.random()的方式。
正例:在 JDK7 以後,能夠直接使用 API ThreadLocalRandom,而在 JDK7 以前,須要編碼保 證每一個線程持有一個實例。
說明:若是非得使用 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;
}
複製代碼
【強制】在使用正則表達式時,利用好其預編譯功能,能夠有效加快正則匹配速度。
【強制】後臺輸送給頁面的變量必須加$!{var}——中間的感嘆號。
說明:若是 var=null 或者不存在,那麼${var}會直接顯示在頁面上。
正例:if (obj != null) {...}
反例:try { obj.method() } catch (NullPointerException e) {...}
【強制】異常不要用來作流程控制,條件控制,由於異常的處理效率比條件分支低。
【強制】對大段代碼進行 try-catch,這是不負責任的表現
【強制】捕獲異常是爲了處理它,不要捕獲了卻什麼都不處理而拋棄之,若是不想處理它,請 將該異常拋給它的調用者。最外層的業務使用者,必須處理異常,將其轉化爲用戶能夠理解的 內容。
【推薦】防止 NPE,是程序員的基本修養.
【參考】在代碼中使用「拋異常」仍是「返回錯誤碼」,對於公司外的 http/api 開放接口必須 使用「錯誤碼」;而應用內部推薦異常拋出;跨應用間 RPC 調用優先考慮使用 Result 方式,封 裝 isSuccess()方法、「錯誤碼」、「錯誤簡短信息」
【強制】日誌文件推薦至少保存 15 天,由於有些異常具有以「周」爲頻次發生的特色。
【強制】應用中不可直接使用日誌系統(Log4j、Logback)中的 API,而應依賴使用日誌框架SLF4J中的API,使用門面模式的日誌框架,有利於維護和各個類的日誌處理方式統一。
【強制】隸屬於用戶我的的頁面或者功能必須進行權限控制校驗。
【強制】用戶輸入的 SQL 參數嚴格使用參數綁定或者 METADATA 字段值限定,防止 SQL 注入, 禁止字符串拼接 SQL 訪問數據庫。
【強制】用戶請求傳入的任何參數必須作有效性驗證。
【強制】若是存儲的字符串長度幾乎相等,使用 char 定長字符串類型。
【強制】表達是與否概念的字段,必須使用 is _ xxx 的方式命名,數據類型是 unsigned tinyint( 1 表示是,0 表示否 )
【強制】 varchar 是可變長字符串,不預先分配存儲空間,長度不要超過 5000,若是存儲長 度大於此值,定義字段類型爲 text ,獨立出來一張表,用主鍵來對應,避免影響其它字段索 引效率。
【強制】表必備三字段: id , gmt _ create , gmt _ modified 。
【推薦】字段容許適當冗餘,以提升查詢性能,但必須考慮數據一致。冗餘字段應遵循:
【強制】業務上具備惟一特性的字段,即便是多個字段的組合,也必須建成惟一索引。
【強制】超過三個表禁止 join。須要 join 的字段,數據類型必須絕對一致;多表關聯查詢時, 保證被關聯的字段須要有索引。
【強制】在 varchar 字段上創建索引時,必須指定索引長度,不必對全字段創建索引,根據 實際文本區分度決定索引長度便可。
【強制】頁面搜索嚴禁左模糊或者全模糊,若是須要請走搜索引擎來解決。
【推薦】利用覆蓋索引來進行查詢操做,避免回表。說明:若是一本書須要知道第 11 章是什麼標題,會翻開第 11 章對應的那一頁嗎?目錄瀏覽 一下就好,這個目錄就是起到覆蓋索引的做用。
正例:可以創建索引的種類:主鍵索引、惟一索引、普通索引,而覆蓋索引是一種查詢的一種 效果,用 explain 的結果,extra 列會出現:using index。
正例:若是 where a=? and b=? ,a 列的幾乎接近於惟一值,那麼只須要單建 idx_a 索引即 可。
【強制】不要使用 count(列名)或 count(常量)來替代 count(*),count(*)是 SQL92 定義的 標準統計行數的語法,跟數據庫無關,跟 NULL 和非 NULL 無關。
【強制】不得使用外鍵與級聯,一切外鍵概念必須在應用層解決。
【強制】禁止使用存儲過程,存儲過程難以調試和擴展,更沒有移植性。
【推薦】高併發服務器建議調小 TCP 協議的 time_ wait 超時時間。
【推薦】調大服務器所支持的最大文件句柄數 (File Descriptor ,簡寫爲 fd) 。
【推薦】給 JVM 設置-XX:+HeapDumpOnOutOfMemoryError 參數,讓 JVM 碰到 OOM 場景時輸出 dump 信息。
【推薦】在線上生產環境, JVM 的 Xms 和 Xmx 設置同樣大小的內存容量,避免在 GC 後調整堆 大小帶來的壓力。
【參考】服務器內部重定向使用 forward; 外部重定向地址使用 URL 拼裝工具類來生成,不然 會帶來 URL 維護不一致的問題和潛在的安全風險。
我是蠻三刀把刀,目前爲後臺開發工程師。主要關注後臺開發,網絡安全,Python爬蟲等技術。
來微信和我聊聊:yangzd1102
Github:github.com/qqxx6661
若是文章對你有幫助,不妨收藏起來並轉發給您的朋友們~