本文主要講解阿里JAVA開(kāi)發(fā)手冊(cè)中比較重要的設(shè)計(jì)規(guī)范,這些重要的設(shè)計(jì)規(guī)范有助于我們改進(jìn)自己的代碼,提升系統(tǒng)的系統(tǒng)的性能。
曾經(jīng)與一位從阿里出來(lái)的Java工程師一起工作過(guò)一段時(shí)間,他的技術(shù)說(shuō)不上非常厲害,但是,他的代碼寫(xiě)的的非常好,凡是他做的功能很少出現(xiàn)Bug。我就很好奇,于是經(jīng)常向他請(qǐng)教一些代碼設(shè)計(jì)的原則,然后他告訴了我阿里Java手冊(cè)。并且,他將這個(gè)手冊(cè)進(jìn)行了修改,也成為了我司Java程序員的開(kāi)發(fā)手冊(cè)。這篇文章就讓我們看一看這個(gè)手冊(cè)中比較重要的原則。
【強(qiáng)制】代碼中的命名均不能以下劃線或美元符號(hào)開(kāi)始,也不能以下劃線或美元符號(hào)結(jié)束。
反例:_name / __name / $name / name_ / name$ / name__
【強(qiáng)制】類型與中括號(hào)緊挨相連來(lái)表示數(shù)組。
正例:定義整形數(shù)組 int[] arrayDemo; 反例:在 main 參數(shù)中,使用 String args[]來(lái)定義。
【強(qiáng)制】POJO 類中布爾類型變量都不要加 is 前綴,否則部分框架解析會(huì)引起序列化錯(cuò)誤。
說(shuō)明:表達(dá)是與否的值采用 is_xxx 的命名方式,所以,需要在 設(shè)置從 is_xxx 到 xxx 的映射關(guān)系。
反例:定義為基本數(shù)據(jù)類型 Boolean isDeleted 的屬性,它的方法也是 isDeleted(),RPC 框架在反向解 析的時(shí)候,“誤以為”對(duì)應(yīng)的屬性名稱是 deleted,導(dǎo)致屬性獲取不到,進(jìn)而拋出異常。
【推薦】在常量與變量的命名時(shí),表示類型的名詞放在詞尾,以提升辨識(shí)度。
正例:startTime / workQueue / nameList / TERMINATED_THREAD_COUNT
反例:startedAt / QueueOfWork / listName / COUNT_TERMINATED_THREAD
【推薦】接口類中的方法和屬性不要加任何修飾符號(hào)(public 也不要加),保持代碼的簡(jiǎn)潔 性,并加上有效的 Javadoc 注釋。盡量不要在接口里定義變量,如果一定要定義變量,肯定 是與接口方法相關(guān),并且是整個(gè)應(yīng)用的基礎(chǔ)常量。
正例:接口方法簽名 void commit();
接口基礎(chǔ)常量 String COMPANY = "alibaba";
反例:接口方法定義 public abstract void f();
說(shuō)明:JDK8 中接口允許有默認(rèn)實(shí)現(xiàn),那么這個(gè) default 方法,是對(duì)所有實(shí)現(xiàn)類都有價(jià)值的默認(rèn)實(shí)現(xiàn)。
【參考】枚舉類名帶上 Enum 后綴,枚舉成員名稱需要全大寫(xiě),單詞間用下劃線隔開(kāi)。
說(shuō)明:枚舉其實(shí)就是特殊的類,域成員均為常量,且構(gòu)造方法被默認(rèn)強(qiáng)制是私有。
正例:枚舉名字為 ProcessStatusEnum 的成員名稱:SUCCESS / UNKNOWN_REASON。
【參考】各層命名規(guī)約:
1) 獲取單個(gè)對(duì)象的方法用 get 做前綴。
2) 獲取多個(gè)對(duì)象的方法用 list 做前綴,復(fù)數(shù)形式結(jié)尾如:listObjects。 3) 獲取統(tǒng)計(jì)值的方法用 count 做前綴。
4) 插入的方法用 save/insert 做前綴。
5) 刪除的方法用 remove/delete 做前綴。
6) 修改的方法用 update 做前綴。
1) 數(shù)據(jù)對(duì)象:xxxDO,xxx 即為數(shù)據(jù)表名。
2) 數(shù)據(jù)傳輸對(duì)象:xxxDTO,xxx 為業(yè)務(wù)領(lǐng)域相關(guān)的名稱。
3) 展示對(duì)象:xxxVO,xxx 一般為網(wǎng)頁(yè)名稱。
4) POJO 是 DO/DTO/BO/VO 的統(tǒng)稱,禁止命名成 xxxPOJO。
【強(qiáng)制】不允許任何魔法值(即未經(jīng)預(yù)先定義的常量)直接出現(xiàn)在代碼中。
反例:String key = "Id#taobao_" + tradeId;
cache.put(key, value);
cache.put(key, value);
緩存 get 時(shí),由于在代碼復(fù)制時(shí),漏掉下劃線,導(dǎo)致緩存擊穿而出現(xiàn)問(wèn)題
【強(qiáng)制】避免通過(guò)一個(gè)類的對(duì)象引用訪問(wèn)此類的靜態(tài)變量或靜態(tài)方法,無(wú)謂增加編譯器解析 成本,直接用類名來(lái)訪問(wèn)即可。
【強(qiáng)制】相同參數(shù)類型,相同業(yè)務(wù)含義,才可以使用Java的可變參數(shù),避免使用Object。
說(shuō)明:可變參數(shù)必須放置在參數(shù)列表的最后。(提倡同學(xué)們盡量不用可變參數(shù)編程)
正例:public ListlistUsers(String type, Long... ids) {...}
【強(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)行判斷。
關(guān)于基本數(shù)據(jù)類型與包裝數(shù)據(jù)類型的使用標(biāo)準(zhǔn)如下:
說(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)用失敗,異常退出。
【強(qiáng)制】POJO 類必須寫(xiě) toString 方法。
使用 IDE 中的工具:source> generate toString 時(shí),如果繼承了另一個(gè) POJO 類,注意在前面加一下 super.toString。
說(shuō)明:在方法執(zhí)行拋出異常時(shí),可以直接調(diào)用 POJO 的 toString()方法打印其屬性值,便于排查問(wèn)題。
【強(qiáng)制】關(guān)于hashCode和equals的處理,遵循如下規(guī)則:
說(shuō)明:String 已覆寫(xiě) hashCode 和 equals 方法,所以我們可以愉快地使用 String 對(duì)象作為 key 來(lái)使用。
【強(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)題。
【強(qiáng)制】線程池不允許使用Executors去創(chuàng)建,而是通過(guò)ThreadPoolExecutor的方式,這樣的處理方式讓寫(xiě)的同學(xué)更加明確線程池的運(yùn)行規(guī)則,規(guī)避資源耗盡的風(fēng)險(xiǎn)。
以上規(guī)范在設(shè)計(jì)代碼中,是比較重要的原則。如果編寫(xiě)代碼的過(guò)程中,可以依照以上原則,那代碼的可讀性和可維護(hù)性將大大提升
意見(jiàn)反饋
×
Copyright © 1998-2019 甘肅信息港 All rights reserved.