日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

阿里java规范手册总结

發(fā)布時(shí)間:2023/12/14 编程问答 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 阿里java规范手册总结 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文總結(jié)一些常見(jiàn)編碼注意問(wèn)題,每條規(guī)范來(lái)自各個(gè)模塊,所以序號(hào)有點(diǎn)凌亂,一些簡(jiǎn)單及很少用的規(guī)范沒(méi)有進(jìn)行收錄,具體的規(guī)范可見(jiàn)文末阿里java規(guī)范.pdf,進(jìn)行下載詳細(xì)閱讀

OOP規(guī)約

7.【強(qiáng)制】所有的相同類型的包裝類對(duì)象之間值的比較,全部使用equals方法比較。 說(shuō)明:對(duì)于Integer var = ? 在-128至127范圍內(nèi)的賦值,Integer對(duì)象是在IntegerCache.cache產(chǎn)生,會(huì)復(fù)用已有對(duì)象,這個(gè)區(qū)間內(nèi)的Integer值可以直接使用==進(jìn)行判斷,但是這個(gè)區(qū)間之外的所有數(shù)據(jù),都會(huì)在堆上產(chǎn)生,并不會(huì)復(fù)用已有對(duì)象,這是一個(gè)大坑,推薦使用equals方法進(jìn)行判斷。
8. 關(guān)于基本數(shù)據(jù)類型與包裝數(shù)據(jù)類型的使用標(biāo)準(zhǔn)如下: 1) 【強(qiáng)制】所有的POJO類屬性必須使用包裝數(shù)據(jù)類型。 2) 【強(qiáng)制】RPC方法的返回值和參數(shù)必須使用包裝數(shù)據(jù)類型。 3) 【推薦】所有的局部變量使用基本數(shù)據(jù)類型。 說(shuō)明:POJO類屬性沒(méi)有初值是提醒使用者在需要使用時(shí),必須自己顯式地進(jìn)行賦值,任何NPE問(wèn)題,或者入庫(kù)檢查,都由使用者來(lái)保證。 正例:數(shù)據(jù)庫(kù)的查詢結(jié)果可能是null,因?yàn)樽詣?dòng)拆箱,用基本數(shù)據(jù)類型接收有NPE風(fēng)險(xiǎn)。 反例:比如顯示成交總額漲跌情況,即正負(fù)x%,x為基本數(shù)據(jù)類型,調(diào)用的RPC服務(wù),調(diào)用不成功時(shí),返回的是默認(rèn)值,頁(yè)面顯示為0%,這是不合理的,應(yīng)該顯示成中劃線。所以包裝數(shù)據(jù)類型的null值,能夠表示額外的信息,如:遠(yuǎn)程調(diào)用失敗,異常退出。
11. 【強(qiáng)制】構(gòu)造方法里面禁止加入任何業(yè)務(wù)邏輯,如果有初始化邏輯,請(qǐng)放在init方法中。
12. 【強(qiáng)制】POJO類必須寫(xiě)toString方法。使用IDE的中工具:source> generate toString時(shí),如果繼承了另一個(gè)POJO類,注意在前面加一下super.toString。 說(shuō)明:在方法執(zhí)行拋出異常時(shí),可以直接調(diào)用POJO的toString()方法打印其屬性值,便于排查問(wèn)題。
20. 【推薦】類成員與方法訪問(wèn)控制從嚴(yán): 1) 如果不允許外部直接通過(guò)new來(lái)創(chuàng)建對(duì)象,那么構(gòu)造方法必須是private。 2) 工具類不允許有public或default構(gòu)造方法。 3) 類非static成員變量并且與子類共享,必須是protected。 4) 類非static成員變量并且僅在本類使用,必須是private。 5) 類static成員變量如果僅在本類使用,必須是private。 6) 若是static成員變量,必須考慮是否為final。 7) 類成員方法只供類內(nèi)部調(diào)用,必須是private。 8) 類成員方法只對(duì)繼承類公開(kāi),那么限制為protected。 說(shuō)明:任何類、方法、參數(shù)、變量,嚴(yán)控訪問(wèn)范圍。過(guò)于寬泛的訪問(wèn)范圍,不利于模塊解耦。思考:如果是一個(gè)private的方法,想刪除就刪除,可是一個(gè)public的service方法,或者一個(gè)public的成員變量,刪除一下,不得手心冒點(diǎn)汗嗎?變量像自己的小孩,盡量在自己的視線內(nèi),變量作用域太大,無(wú)限制的到處跑,那么你會(huì)擔(dān)心的。

集合處理

1. 【強(qiáng)制】關(guān)于hashCode和equals的處理,遵循如下規(guī)則: 1) 只要重寫(xiě)equals,就必須重寫(xiě)hashCode。 2) 因?yàn)镾et存儲(chǔ)的是不重復(fù)的對(duì)象,依據(jù)hashCode和equals進(jìn)行判斷,所以Set存儲(chǔ)的對(duì)象必須重寫(xiě)這兩個(gè)方法。 3) 如果自定義對(duì)象做為Map的鍵,那么必須重寫(xiě)hashCode和equals。 說(shuō)明:String重寫(xiě)了hashCode和equals方法,所以我們可以非常愉快地使用String對(duì)象作為key來(lái)使用。
7. 【強(qiáng)制】不要在foreach循環(huán)里進(jìn)行元素的remove/add操作。remove元素請(qǐng)使用Iterator方式,如果并發(fā)操作,需要對(duì)Iterator對(duì)象加鎖。 正例: 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); } } 說(shuō)明:以上代碼的執(zhí)行結(jié)果肯定會(huì)出乎大家的意料,那么試一下把“1”換成“2”,會(huì)是同樣的結(jié)果嗎?
8. 【強(qiáng)制】 在JDK7版本及以上,Comparator要滿足如下三個(gè)條件,不然Arrays.sort,Collections.sort會(huì)報(bào)IllegalArgumentException異常。 說(shuō)明:三個(gè)條件如下 1) x,y的比較結(jié)果和y,x的比較結(jié)果相反。 2) x>y,y>z,則x>z。 3) x=y,則x,z比較結(jié)果和y,z比較結(jié)果相同。 反例:下例中沒(méi)有處理相等的情況,實(shí)際使用中可能會(huì)出現(xiàn)異常: new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { return o1.getId() > o2.getId() ? 1 : -1; } };

并發(fā)處理 3. 【強(qiáng)制】線程資源必須通過(guò)線程池提供,不允許在應(yīng)用中自行顯式創(chuàng)建線程。 說(shuō)明:使用線程池的好處是減少在創(chuàng)建和銷毀線程上所花的時(shí)間以及系統(tǒng)資源的開(kāi)銷,解決資源不足的問(wèn)題。如果不使用線程池,有可能造成系統(tǒng)創(chuàng)建大量同類線程而導(dǎo)致消耗完內(nèi)存或者“過(guò)度切換”的問(wèn)題。
4. 【強(qiáng)制】線程池不允許使用 Executors ExecutorsExecutors Executors ExecutorsExecutors去創(chuàng)建,而是通過(guò) 去創(chuàng)建,而是通過(guò) 去創(chuàng)建,而是通過(guò) ThreadPoolExecutor ThreadPoolExecutorThreadPoolExecutor ThreadPoolExecutor ThreadPoolExecutor ThreadPoolExecutor ThreadPoolExecutorThreadPoolExecutor ThreadPoolExecutor ThreadPoolExecutorThreadPoolExecutor的方式,這樣 的方式,這樣 的處理方式讓寫(xiě)同學(xué)更加明確線程池運(yùn)行規(guī)則,避資源耗盡風(fēng)險(xiǎn)。 說(shuō)明: Executors ExecutorsExecutors Executors ExecutorsExecutors返回的線程池對(duì)象 返回的線程池對(duì)象 的弊端 如下 : 1)FixedThreadPool FixedThreadPool FixedThreadPool FixedThreadPool FixedThreadPool FixedThreadPool FixedThreadPool FixedThreadPool和 SingleThread SingleThreadSingleThread SingleThread SingleThread SingleThread SingleThreadPoolPool Pool: 允許的請(qǐng)求隊(duì)列長(zhǎng)度為 Integer.MAX_VALUE,可 能會(huì)堆積大量的請(qǐng)求,從而導(dǎo)致 OOM。 2)CachedThreadPool CachedThreadPool CachedThreadPool CachedThreadPool CachedThreadPool CachedThreadPool CachedThreadPool CachedThreadPool 和 ScheduledThreadPool ScheduledThreadPoolScheduledThreadPool ScheduledThreadPool ScheduledThreadPool ScheduledThreadPool ScheduledThreadPool ScheduledThreadPool ScheduledThreadPool ScheduledThreadPool : 允許的創(chuàng)建線程數(shù)量為 Integer.MAX_VALUE,可能會(huì)創(chuàng)建大量的線程,從而導(dǎo)致 OOM。
5. 【強(qiáng)制】SimpleDateFormat 是線程不安全的類,一般不要定義為static變量,如果定義為static,必須加鎖,或者使用DateUtils工具類。 正例:注意線程安全,使用DateUtils。亦推薦如下處理: private static final ThreadLocal<DateFormat> df = new ThreadLocal<DateFormat>() { @Override protected DateFormat initialValue() { return new SimpleDateFormat("yyyy-MM-dd"); } }; 說(shuō)明:如果是JDK8的應(yīng)用,可以使用Instant代替Date,LocalDateTime代替Calendar,DateTimeFormatter代替SimpleDateFormat,官方給出的解釋:simple beautiful strong immutable thread-safe。
6. 【強(qiáng)制】高并發(fā)時(shí),同步調(diào)用應(yīng)該去考量鎖的性能損耗。能用無(wú)鎖數(shù)據(jù)結(jié)構(gòu),就不要用鎖;能鎖區(qū)塊,就不要鎖整個(gè)方法體;能用對(duì)象鎖,就不要用類鎖。 說(shuō)明:盡可能使加鎖的代碼塊工作量盡可能的小,避免在鎖代碼塊中調(diào)用RPC方法。
8. 【強(qiáng)制】并發(fā)修改同一記錄時(shí),避免更新丟失,需要加鎖。要么在應(yīng)用層加鎖,要么在緩存加鎖,要么在數(shù)據(jù)庫(kù)層使用樂(lè)觀鎖,使用version作為更新依據(jù)。 說(shuō)明:如果每次訪問(wèn)沖突概率小于20%,推薦使用樂(lè)觀鎖,否則使用悲觀鎖。樂(lè)觀鎖的重試次數(shù)不得小于3次。

其他

1. 【強(qiáng)制】在使用正則表達(dá)式時(shí),利用好其預(yù)編譯功能,可以有效加快正則匹配速度。 說(shuō)明:不要在方法體內(nèi)定義:Pattern pattern = Pattern.compile(規(guī)則);
3. 【強(qiáng)制】對(duì)大段代碼進(jìn)行try-catch,這是不負(fù)責(zé)任的表現(xiàn)。catch時(shí)請(qǐng)分清穩(wěn)定代碼和非穩(wěn)定代碼,穩(wěn)定代碼指的是無(wú)論如何不會(huì)出錯(cuò)的代碼。對(duì)于非穩(wěn)定代碼的catch盡可能進(jìn)行區(qū)分異常類型,再做對(duì)應(yīng)的異常處理。
13. 【參考】避免出現(xiàn)重復(fù)的代碼(Don’t Repeat Yourself),即DRY原則。 說(shuō)明:隨意復(fù)制和粘貼代碼,必然會(huì)導(dǎo)致代碼的重復(fù),在以后需要修改時(shí),需要修改所有的副本,容易遺漏。必要時(shí)抽取共性方法,或者抽象公共類,甚至是組件化。 正例:一個(gè)類中有多個(gè)public方法,都需要進(jìn)行數(shù)行相同的參數(shù)校驗(yàn)操作,這個(gè)時(shí)候請(qǐng)抽取: private boolean checkParam(DTO dto) {...}
7. 【強(qiáng)制】在使用平臺(tái)資源,譬如短信、郵件、電話、下單、支付,必須實(shí)現(xiàn)正確的防重放限制,如數(shù)量限制、疲勞度控制、驗(yàn)證碼校驗(yàn),避免被濫刷、資損。 說(shuō)明:如注冊(cè)時(shí)發(fā)送驗(yàn)證碼到手機(jī),如果沒(méi)有限制次數(shù)和頻率,那么可以利用此功能騷擾到其它用戶,并造成短信平臺(tái)資源浪費(fèi)。
5. 【強(qiáng)制】 在代碼中寫(xiě)分頁(yè)查詢邏輯時(shí),若count為0應(yīng)直接返回,避免執(zhí)行后面的分頁(yè)語(yǔ)句。
6. 【強(qiáng)制】不得使用外鍵與級(jí)聯(lián),一切外鍵概念必須在應(yīng)用層解決。 說(shuō)明:以學(xué)生和成績(jī)的關(guān)系為例,學(xué)生表中的student_id是主鍵,那么成績(jī)表中的student_id則為外鍵。如果更新學(xué)生表中的student_id,同時(shí)觸發(fā)成績(jī)表中的student_id更新,即為級(jí)聯(lián)更新。外鍵與級(jí)聯(lián)更新適用于單機(jī)低并發(fā),不適合分布式、高并發(fā)集群;級(jí)聯(lián)更新是強(qiáng)阻塞,存在數(shù)據(jù)庫(kù)更新風(fēng)暴的風(fēng)險(xiǎn);外鍵影響數(shù)據(jù)庫(kù)的插入速度。
7. 【強(qiáng)制】禁止使用存儲(chǔ)過(guò)程,存儲(chǔ)過(guò)程難以調(diào)試和擴(kuò)展,更沒(méi)有移植性。
10. 【參考】如果有全球化需要,所有的字符存儲(chǔ)與表示,均以u(píng)tf-8編碼,注意字符統(tǒng)計(jì)函數(shù)的區(qū)別。 說(shuō)明: SELECT LENGTH("輕松工作"); 返回為12 SELECT CHARACTER_LENGTH("輕松工作"); 返回為4 如果需要存儲(chǔ)表情,那么選擇utfmb4來(lái)進(jìn)行存儲(chǔ),注意它與utf-8編碼的區(qū)別。


完整版pdf下載鏈接 https://download.csdn.net/download/fu250/10308874??

總結(jié)

以上是生活随笔為你收集整理的阿里java规范手册总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。