阿里java规范手册总结
生活随笔
收集整理的這篇文章主要介紹了
阿里java规范手册总结
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文總結一些常見編碼注意問題,每條規范來自各個模塊,所以序號有點凌亂,一些簡單及很少用的規范沒有進行收錄,具體的規范可見文末阿里java規范.pdf,進行下載詳細閱讀
OOP規約
7.【強制】所有的相同類型的包裝類對象之間值的比較,全部使用equals方法比較。 說明:對于Integer var = ? 在-128至127范圍內的賦值,Integer對象是在IntegerCache.cache產生,會復用已有對象,這個區間內的Integer值可以直接使用==進行判斷,但是這個區間之外的所有數據,都會在堆上產生,并不會復用已有對象,這是一個大坑,推薦使用equals方法進行判斷。8. 關于基本數據類型與包裝數據類型的使用標準如下: 1) 【強制】所有的POJO類屬性必須使用包裝數據類型。 2) 【強制】RPC方法的返回值和參數必須使用包裝數據類型。 3) 【推薦】所有的局部變量使用基本數據類型。 說明:POJO類屬性沒有初值是提醒使用者在需要使用時,必須自己顯式地進行賦值,任何NPE問題,或者入庫檢查,都由使用者來保證。 正例:數據庫的查詢結果可能是null,因為自動拆箱,用基本數據類型接收有NPE風險。 反例:比如顯示成交總額漲跌情況,即正負x%,x為基本數據類型,調用的RPC服務,調用不成功時,返回的是默認值,頁面顯示為0%,這是不合理的,應該顯示成中劃線。所以包裝數據類型的null值,能夠表示額外的信息,如:遠程調用失敗,異常退出。
11. 【強制】構造方法里面禁止加入任何業務邏輯,如果有初始化邏輯,請放在init方法中。
12. 【強制】POJO類必須寫toString方法。使用IDE的中工具:source> generate toString時,如果繼承了另一個POJO類,注意在前面加一下super.toString。 說明:在方法執行拋出異常時,可以直接調用POJO的toString()方法打印其屬性值,便于排查問題。
20. 【推薦】類成員與方法訪問控制從嚴: 1) 如果不允許外部直接通過new來創建對象,那么構造方法必須是private。 2) 工具類不允許有public或default構造方法。 3) 類非static成員變量并且與子類共享,必須是protected。 4) 類非static成員變量并且僅在本類使用,必須是private。 5) 類static成員變量如果僅在本類使用,必須是private。 6) 若是static成員變量,必須考慮是否為final。 7) 類成員方法只供類內部調用,必須是private。 8) 類成員方法只對繼承類公開,那么限制為protected。 說明:任何類、方法、參數、變量,嚴控訪問范圍。過于寬泛的訪問范圍,不利于模塊解耦。思考:如果是一個private的方法,想刪除就刪除,可是一個public的service方法,或者一個public的成員變量,刪除一下,不得手心冒點汗嗎?變量像自己的小孩,盡量在自己的視線內,變量作用域太大,無限制的到處跑,那么你會擔心的。
集合處理
1. 【強制】關于hashCode和equals的處理,遵循如下規則: 1) 只要重寫equals,就必須重寫hashCode。 2) 因為Set存儲的是不重復的對象,依據hashCode和equals進行判斷,所以Set存儲的對象必須重寫這兩個方法。 3) 如果自定義對象做為Map的鍵,那么必須重寫hashCode和equals。 說明:String重寫了hashCode和equals方法,所以我們可以非常愉快地使用String對象作為key來使用。7. 【強制】不要在foreach循環里進行元素的remove/add操作。remove元素請使用Iterator方式,如果并發操作,需要對Iterator對象加鎖。 正例: Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { String item = iterator.next(); if (刪除元素的條件) { iterator.remove(); } } 反例: List<String> list = new ArrayList<String>(); list.add("1"); list.add("2"); for (String item : list) { if ("1".equals(item)) { list.remove(item); } } 說明:以上代碼的執行結果肯定會出乎大家的意料,那么試一下把“1”換成“2”,會是同樣的結果嗎?
8. 【強制】 在JDK7版本及以上,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; } }; 并發處理 3. 【強制】線程資源必須通過線程池提供,不允許在應用中自行顯式創建線程。 說明:使用線程池的好處是減少在創建和銷毀線程上所花的時間以及系統資源的開銷,解決資源不足的問題。如果不使用線程池,有可能造成系統創建大量同類線程而導致消耗完內存或者“過度切換”的問題。
4. 【強制】線程池不允許使用 Executors ExecutorsExecutors Executors ExecutorsExecutors去創建,而是通過 去創建,而是通過 去創建,而是通過 ThreadPoolExecutor ThreadPoolExecutorThreadPoolExecutor ThreadPoolExecutor ThreadPoolExecutor ThreadPoolExecutor ThreadPoolExecutorThreadPoolExecutor ThreadPoolExecutor ThreadPoolExecutorThreadPoolExecutor的方式,這樣 的方式,這樣 的處理方式讓寫同學更加明確線程池運行規則,避資源耗盡風險。 說明: Executors ExecutorsExecutors Executors ExecutorsExecutors返回的線程池對象 返回的線程池對象 的弊端 如下 : 1)FixedThreadPool FixedThreadPool FixedThreadPool FixedThreadPool FixedThreadPool FixedThreadPool FixedThreadPool FixedThreadPool和 SingleThread SingleThreadSingleThread SingleThread SingleThread SingleThread SingleThreadPoolPool Pool: 允許的請求隊列長度為 Integer.MAX_VALUE,可 能會堆積大量的請求,從而導致 OOM。 2)CachedThreadPool CachedThreadPool CachedThreadPool CachedThreadPool CachedThreadPool CachedThreadPool CachedThreadPool CachedThreadPool 和 ScheduledThreadPool ScheduledThreadPoolScheduledThreadPool ScheduledThreadPool ScheduledThreadPool ScheduledThreadPool ScheduledThreadPool ScheduledThreadPool ScheduledThreadPool ScheduledThreadPool : 允許的創建線程數量為 Integer.MAX_VALUE,可能會創建大量的線程,從而導致 OOM。
5. 【強制】SimpleDateFormat 是線程不安全的類,一般不要定義為static變量,如果定義為static,必須加鎖,或者使用DateUtils工具類。 正例:注意線程安全,使用DateUtils。亦推薦如下處理: private static final ThreadLocal<DateFormat> df = new ThreadLocal<DateFormat>() { @Override protected DateFormat initialValue() { return new SimpleDateFormat("yyyy-MM-dd"); } }; 說明:如果是JDK8的應用,可以使用Instant代替Date,LocalDateTime代替Calendar,DateTimeFormatter代替SimpleDateFormat,官方給出的解釋:simple beautiful strong immutable thread-safe。
6. 【強制】高并發時,同步調用應該去考量鎖的性能損耗。能用無鎖數據結構,就不要用鎖;能鎖區塊,就不要鎖整個方法體;能用對象鎖,就不要用類鎖。 說明:盡可能使加鎖的代碼塊工作量盡可能的小,避免在鎖代碼塊中調用RPC方法。
8. 【強制】并發修改同一記錄時,避免更新丟失,需要加鎖。要么在應用層加鎖,要么在緩存加鎖,要么在數據庫層使用樂觀鎖,使用version作為更新依據。 說明:如果每次訪問沖突概率小于20%,推薦使用樂觀鎖,否則使用悲觀鎖。樂觀鎖的重試次數不得小于3次。
其他
1. 【強制】在使用正則表達式時,利用好其預編譯功能,可以有效加快正則匹配速度。 說明:不要在方法體內定義:Pattern pattern = Pattern.compile(規則);3. 【強制】對大段代碼進行try-catch,這是不負責任的表現。catch時請分清穩定代碼和非穩定代碼,穩定代碼指的是無論如何不會出錯的代碼。對于非穩定代碼的catch盡可能進行區分異常類型,再做對應的異常處理。
13. 【參考】避免出現重復的代碼(Don’t Repeat Yourself),即DRY原則。 說明:隨意復制和粘貼代碼,必然會導致代碼的重復,在以后需要修改時,需要修改所有的副本,容易遺漏。必要時抽取共性方法,或者抽象公共類,甚至是組件化。 正例:一個類中有多個public方法,都需要進行數行相同的參數校驗操作,這個時候請抽取: private boolean checkParam(DTO dto) {...}
7. 【強制】在使用平臺資源,譬如短信、郵件、電話、下單、支付,必須實現正確的防重放限制,如數量限制、疲勞度控制、驗證碼校驗,避免被濫刷、資損。 說明:如注冊時發送驗證碼到手機,如果沒有限制次數和頻率,那么可以利用此功能騷擾到其它用戶,并造成短信平臺資源浪費。
5. 【強制】 在代碼中寫分頁查詢邏輯時,若count為0應直接返回,避免執行后面的分頁語句。
6. 【強制】不得使用外鍵與級聯,一切外鍵概念必須在應用層解決。 說明:以學生和成績的關系為例,學生表中的student_id是主鍵,那么成績表中的student_id則為外鍵。如果更新學生表中的student_id,同時觸發成績表中的student_id更新,即為級聯更新。外鍵與級聯更新適用于單機低并發,不適合分布式、高并發集群;級聯更新是強阻塞,存在數據庫更新風暴的風險;外鍵影響數據庫的插入速度。
7. 【強制】禁止使用存儲過程,存儲過程難以調試和擴展,更沒有移植性。
10. 【參考】如果有全球化需要,所有的字符存儲與表示,均以utf-8編碼,注意字符統計函數的區別。 說明: SELECT LENGTH("輕松工作"); 返回為12 SELECT CHARACTER_LENGTH("輕松工作"); 返回為4 如果需要存儲表情,那么選擇utfmb4來進行存儲,注意它與utf-8編碼的區別。
完整版pdf下載鏈接 https://download.csdn.net/download/fu250/10308874??
總結
以上是生活随笔為你收集整理的阿里java规范手册总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 月光博客:我的知识管理工具列表(强烈推荐
- 下一篇: 2010 年下半年系统分析师案例分析真题