dwcs5怎么把做的網(wǎng)站適屏網(wǎng)站提交入口
阿里巴巴Java開發(fā)手冊學習記錄
一、編程規(guī)約
1.命名風格
嚴禁使用英文 + 拼音混合使用
類名應所有單詞的首字母大寫,除了(UserDO,XxxDTO, XxxPo等)
常量的命名應該是大寫 + 單詞間用下劃線連接
抽象類的應以Abstract/Base開頭
POJO類中的布爾變量,都不要以is前綴,否則某些框架解析會引起序列化錯誤, 。
(之前看一個文章就是因為XxxDTO方法的命名為isXxxXxx(),導致方法被錯誤的序列化,造成了線上事故,文章:https://mp.weixin.qq.com/s/994BAkKPEeBz_gs_6LN2DQ)如果模塊、接口、類、方法使用了設計模式,應體現(xiàn)在命名中
領域模型命名規(guī)約
- 數(shù)據(jù)對象:xxxDO, xxx為數(shù)據(jù)表名
數(shù)據(jù)傳輸對象:xxxDTO, xxx為業(yè)務領域相關
展示對象,xxxVO,xxx為網(wǎng)頁名稱
POJO是DO/DTO/BO/VO的統(tǒng)稱,禁止使用xxxPOJO
如果變量值僅在一個固定范圍內(nèi)變化用enum聲明
2.代碼格式
- 單行字符限制不超過120各,超出要換行:
- 第二行相對于第一行縮進4個空格
- 運算符與下文一起換行(例如:“.”)
- 方法調用中多個參數(shù),
在逗號后換行
- 可以插入一個空行將不同的邏輯、語義、談業(yè)務分隔開,提高可讀性。
3.OOP規(guī)約
- 所有重寫父類的方法都需要加@Override,可以判斷是否重寫成功
- 接口過時必須加@Deprecated,并說明新接口的位置。
- 不使用過時的類和方法
在使用equals時,應使用常量或者確定有值的對象的equals的方法
- 所有的POJO類屬性必須使用包裝類型,RPC方法的返回值和參數(shù)必須使用包裝類型
- 如果完全不兼容升級,避免反序列化混亂,要修改serialVersionUID
- 構造方法中不加任何業(yè)務邏輯
- 禁止在POJO類中同時存在一個屬性的isXxx()和getXxx()方法
- 因為在序列化時,不確定優(yōu)先調用哪個方法,對于is開頭的枚舉型變量,會在序列化調用isXxx的時候會把屬性的is吃掉,導致序列化出錯。(案例:https://zhuanlan.zhihu.com/p/265869701)
- 解決方案:1.遵循開發(fā)規(guī)范,不要用is開頭的變量。2.使用JSONField(name = “anotherName”)來定制屬性名。3.可以手動修改getter和setter。
- 類內(nèi)方法定義順序:公有方法>私有>getter/setter方法
- 對象的clone方法默認時淺拷貝,若想要實現(xiàn)深拷貝,需要重寫clone方法。
- 工具類不允許有public和default構造方法
4.集合處理
- 只要重寫equals,就必須重寫hashcode
- 使用set存儲自定義對象時,自定義對象需要重寫equals、hashcode 方法
在使用sublist方法時,對原集合的增加或刪除,均會導致子列表遍歷、增加、刪除產(chǎn)生并發(fā)修改異常。
在進行l(wèi)ist的toArray(size)方法轉數(shù)組時,應該傳入list.size()作為參數(shù)這樣返回的就是當前類型的數(shù)組
,如果直接使用無參toArray方法時,返回值是Object類型的數(shù)組。- Arrays.asList()把數(shù)組轉換成集合時,不可以使用add等修改方法,否則拋異常。
- PECS(
Producer Extends Consumer Super
)原則:頻繁往外讀取內(nèi)容的,適合用<? extends T>。經(jīng)常往里插入的,適合用<? super T>。- 不用在foreach里進行元素的remove/add操作,remove可以使用iterator方式,如果并發(fā)操作需要對Iterator對象加鎖。(這里雖說
foreach本質也是迭代器實現(xiàn),但是反編譯以后會發(fā)現(xiàn)最后刪除時是通過list直接remove
,而迭代器刪除的是通過迭代器的remove方法刪除的
)
5.并發(fā)處理
- 獲取
單例對象時,需要保證線程安全
- 應該使用
ThreadPoolExecutor創(chuàng)建線程池
- SimpleDateFormat線程不安全,如果定義為static,必須加鎖,也可以使用DateUtils
- 如果是 JDK8 的應用,可以使用 Instant 代替 Date,LocalDateTime 代替 Calendar, DateTimeFormatter 代替 SimpleDateFormat
- 對多個資源(表、對象)同時加鎖時,應該保持加鎖順序的一致性,避免死鎖。
- 并發(fā)修改同一記錄時,避免更新丟失,可以在應用層、緩存加鎖,或者數(shù)據(jù)庫層使用樂觀鎖。(如果每次訪問
沖突概率小于20%,推薦使用樂觀鎖
,否則使用悲觀鎖。樂觀鎖的重試次數(shù)不得小于3 次
。)- 避免多個線程使用一個Random(Random或Math.random),會導致性能下降,可以使用ThreadLocalRandom
- 在多線程場景下計數(shù),volatile無法應對多寫的場景,一般我們會選擇AtomicInteger,但是在
競爭比較激烈的場景下
,可以使用LongAdder性能更好
(空間換時間,內(nèi)部將數(shù)組分段計數(shù)最后求和
,但是只使用計數(shù)場景下)。- ThreadLocal 建議使用static修飾,只需要創(chuàng)建一次,一個線程內(nèi)的所有對象都已操作這個變量。
6.控制語句
- 高并發(fā)場景中,避免使用等于作為中斷或者退出的條件,如果并發(fā)條件沒有處理好,會出現(xiàn)等值“擊穿”的情況,所以應該使用大于或者小于
- 避免在if條件判斷中使用復雜的方法,(getXxx/isXxx除外)
- 循環(huán)體內(nèi)要考慮性能,所以一些不必要的操作應該放到循環(huán)體外進行
7.注釋規(guī)約
- 注釋的主要作用:能精確反應設計思想和代碼邏輯、描述業(yè)務含義。
- 代碼邏輯修改的同時,注釋也要進行相應的修改,尤其是參數(shù)、返回值、異常、核心邏輯
- 所有的枚舉類型的字段必須要有注釋
8.異常處理
- catch異常時,對于非穩(wěn)定代碼來說catch盡量區(qū)分異常類型,再做對應的異常處理,不要對一大段代碼做try-catch處理
- 捕獲了異常就應該處理它
- 應該嚴格避免NPE
9.日志規(guī)約
- 應用中不可直接使用日志系統(tǒng)(Log4j、Logback)中的Api,而應該依賴日志框架SLF4J中的Api。
- 應用中的擴展日志命名方式:appName_logType_logName.log
- 對trace/debug/info級別的日志輸出,應該使用條件輸出或者使用占位符(slf4j支持占位符),對于warn等不滿足的日志級別,即使不輸出,但也會準備參數(shù),浪費系統(tǒng)資源。
- 生產(chǎn)環(huán)境禁止輸出debug級別日志,有選擇地輸出info日志,寫日志輸出語句時思考:有人看嗎?看到這條日志能做什么?能不能給排查問題帶來好處?
- 可以使用warn日志級別來記錄用戶輸出參數(shù)錯誤。
持續(xù)更新…