該筆記出自于<<阿里巴巴 JAVA 開發(fā)手冊>>, 侵刪
主要記錄平時比較重要的而且又容易被忽視的規(guī)約, 方便速查
編程規(guī)約
(一) 命名風(fēng)格
代碼中的命名均不能以下劃線或美元符號開始, 也不能以下劃線或美元符號結(jié)束
代碼中的命名禁止使用拼音與中文混合的方式, 應(yīng)當(dāng)使用正確的英文拼寫,杜絕完全不規(guī)范的縮寫,避免望文不知義, 為了達(dá)到代碼自解釋的目標(biāo),任何自定義編程元素在命名時,使用盡量完整的單詞組合來表達(dá)其意。
注 : alibaba/taobao等國際通用的名稱,可視同英文類名使用UpperCamelCase風(fēng)格,但以下情形例外:DO/ BO / DTO/ VO/ AO/ PO/ UID等。
如UserDO方法名、參數(shù)名、成員變量、局部變量都統(tǒng)一使用lowerCamelCase風(fēng)格,必須遵從駝峰形式。
常量命名全部大寫,單詞間用下劃線隔開,力求語義表達(dá)完整清楚,不要嫌名字長。
抽象類命名使用Abstract或Base開頭
異常類命名使用Exception結(jié)尾
測試類命名以它要測試的類的名稱開始,以Test結(jié)尾。
定義整形數(shù)組int[] arrayDemo
POJO類中布爾類型的變量,都不要加is前綴,否則部分框架解析會引起序列化錯誤。(重要)
包名統(tǒng)一使用小寫, 單數(shù)形式
類名如果有復(fù)數(shù)含義,類名可以使用復(fù)數(shù)形式
如果模塊、接口、類、方法使用了設(shè)計模式,在命名時需體現(xiàn)出具體模式。
如 public classOrder Factory;
public class LoginProxy;接口類的方法和屬性不要添加任何的修飾符號(public 也不能添加), 以求保持代碼的簡潔性能,而且接口類的變量均為與接口方法相關(guān)的常量.
接口和實現(xiàn)類的命名有兩套規(guī)則
對于Service和DAO類, 暴露出來的服務(wù)一定是接口,而其中的實現(xiàn)類命名以Impl為后綴
枚舉類名建議帶上Enum后綴,枚舉成員名稱需要全大寫,單詞間用下劃線隔開
各層命名規(guī)約整合
Service/DAO層方法命名規(guī)約
獲取單個對象的方法用get做前綴
獲取多個對象的方法用list做前綴,復(fù)數(shù)形式結(jié)尾如:listObjects
獲取統(tǒng)計值的方法用count做前綴
插入的方法用save/insert做前綴
刪除的方法用remove/delete做前綴
修改的方法用update做前綴領(lǐng)域模型命名規(guī)約
數(shù)據(jù)對象:xxxDO,xxx即為數(shù)據(jù)表名
數(shù)據(jù)傳輸對象:xxxDTO,xxx為業(yè)務(wù)領(lǐng)域相關(guān)的名稱
展示對象:xxxVO,xxx一般為網(wǎng)頁名稱
POJO是DO/DTO/BO/VO的統(tǒng)稱,禁止命名成xxxPOJO
(二) 常量定義
不允許任何魔法值(即未經(jīng)預(yù)先定義的常量)直接出現(xiàn)在代碼中
在long或者Long賦值時,數(shù)值后使用大寫的L
如: public Long data = 2L;不要使用一個常量類維護(hù)所有常量,要按常量功能進(jìn)行歸類,分開維護(hù)。
常量的復(fù)用層次有五層:跨應(yīng)用共享常量、應(yīng)用內(nèi)共享常量、子工程內(nèi)共享常量、包內(nèi)共享常量、類內(nèi)共享常量。
跨應(yīng)用共享常量:放置在二方庫中,通常是client.jar中的constant目錄下。
應(yīng)用內(nèi)共享常量:放置在一方庫中,通常是子模塊中的constant目錄下。
子工程內(nèi)部共享常量:即在當(dāng)前子工程的constant目錄下。
包內(nèi)共享常量:即在當(dāng)前包下單獨的constant目錄下。
類內(nèi)共享常量:直接在類內(nèi)部private static final定義。
- 如果變量值僅在一個固定范圍內(nèi)變化用enum類型來定義
注:注意區(qū)分常量類和枚舉類的區(qū)別
(三) 代碼格式
對于代碼格式的規(guī)范,阿里巴巴給出了一個正例,這個例子基本囊括了所以基本的規(guī)范操作
public class Main {
public static void main(String[] args) {
// 注釋的雙斜線與注釋內(nèi)容之間有且僅有一個空格。
// 縮進(jìn)四格
String say = "hello";
// 運算符左右必須有一個空格
int flag = 0;
// if語句與括號之間必須有一個空格, 左大括號前加空格不換行, 左大括號后換行
if (flag == 0) {
System.out.println(say);
//右大括號前換行,右大括號有else, 不用換行
} else {
System.out.println("ok");
//右大括號結(jié)束必須換行
}
}
}
補(bǔ)充
- 單行字符數(shù)限制不超過120個,超出需要換行,換行時遵循如下原則
第二行相對第一行縮進(jìn)4個空格,從第三行開始,不再繼續(xù)縮進(jìn)
運算符與下文一起換行
方法調(diào)用的點符號與下文一起換行
方法調(diào)用中的多個參數(shù)需要換行時,在逗號后進(jìn)行
在括號前不要換行
- 方法參數(shù)在定義和傳入時,多個參數(shù)逗號后邊必須加空格,如method(args1, args2, args3);
- IDE的textfileencoding設(shè)置為UTF-8;IDE中文件的換行符使用Unix格式,不要使用Windows格式。
- 單個方法的總行數(shù)不超過80行
- 不同邏輯、不同語義、不同業(yè)務(wù)的代碼之間插入一個空行分隔開來以提升可讀性。
(四) OOP(面向?qū)ο蟪绦蛟O(shè)計)規(guī)約
- 避免通過一個類的對象引用訪問此類的靜態(tài)變量或靜態(tài)方法,無謂增加編譯器解析成本,直接用類名來訪問即可。
- 所有的覆寫方法,必須加@Override注解。
- 相同參數(shù)類型,相同業(yè)務(wù)含義,才可以使用Java的可變參數(shù),避免使用Object
- 不能使用過時的類或方法, 接口過時必須加@Deprecated注解,作為調(diào)用方來說,有義務(wù)去考證過時方法的新實現(xiàn)是什么
- Object的equals方法容易拋空指針異常,應(yīng)使用常量或確定有值的對象來調(diào)用equals,如"test".equals(object)
此處,阿里巴巴推薦使用java.util.Objects#equals(JDK7引入的工具類) - 所有的相同類型的包裝類對象之間值的比較,全部使用equals方法比較。
- 所有的POJO類屬性必須使用包裝數(shù)據(jù)類型
- 定義DO/DTO/VO等POJO類時,不要設(shè)定任何屬性默認(rèn)值
- POJO類必須寫toString方法
- 序列化類新增屬性時,請不要修改serialVersionUID字段,避免反序列失??;如果完全不兼容升級,避免反序列化混亂,那么請修改serialVersionUID值。
- 構(gòu)造方法里面禁止加入任何業(yè)務(wù)邏輯,如果有初始化邏輯,請放在init方法中。
- 禁止在POJO類中,同時存在對應(yīng)屬性xxx的isXxx()和getXxx()方法
- 使用索引訪問用String的split方法得到的數(shù)組時,需做最后一個分隔符后有無內(nèi)容的檢查,否則會有拋IndexOutOfBoundsException的風(fēng)險。
- 當(dāng)一個類有多個構(gòu)造方法,或者多個同名方法,這些方法應(yīng)該按順序放置在一起,便于閱讀,此條規(guī)則優(yōu)先于第16條規(guī)則
- 類內(nèi)方法定義的順序依次是:公有方法或保護(hù)方法> 私有方法> getter/setter方法
說明:公有方法是類的調(diào)用者和維護(hù)者最關(guān)心的方法,首屏展示最好;保護(hù)方法雖然只是子類關(guān)心,也可能是“模板設(shè)計模式”下的核心方法;而私有方法外部一般不需要特別關(guān)心,是一個黑盒實現(xiàn);因為承載的信息價值較低,所有Service和DAO的getter/setter方法放在類體最后 - setter方法中,參數(shù)名稱與類成員變量名稱一致,this.成員名=參數(shù)名。在getter/setter方法中,不要增加業(yè)務(wù)邏輯,增加排查問題的難度。
- 循環(huán)體內(nèi),字符串的連接方式,使用StringBuilder的append方法進(jìn)行擴(kuò)展,避免資源浪費
- final可以聲明類、成員變量、方法、以及本地變量,下列情況使用final關(guān)鍵字
不允許被繼承的類,如:String類。
不允許修改引用的域?qū)ο蟆?br> 不允許被重寫的方法,如:POJO類的setter方法。
不允許運行過程中重新賦值的局部變量。
避免上下文重復(fù)使用一個變量,使用final描述可以強(qiáng)制重新定義一個變量,方便更好地進(jìn)行重構(gòu)。
- 慎用Object的clone方法來拷貝對象,因為clone方法默認(rèn)的是淺拷貝
- 類成員與方法訪問控制從嚴(yán)
如果不允許外部直接通過new來創(chuàng)建對象,那么構(gòu)造方法必須是private。
工具類不允許有public或default構(gòu)造方法
類非static成員變量并且與子類共享,必須是protected
類非static成員變量并且僅在本類使用,必須是private
類static成員變量如果僅在本類使用,必須是private
若是static成員變量,考慮是否為final
類成員方法只供類內(nèi)部調(diào)用,必須是private
類成員方法只對繼承類公開,那么限制為protected
注:任何類、方法、參數(shù)、變量,嚴(yán)控訪問范圍。過于寬泛的訪問范圍,不利于模塊解耦。