阿里Java編程規約(命名風格、常量定義、代碼格式)

命名風格

1、【強制】代碼中的命名均不能以下劃線或美元符號開始,也不能以下劃線或美元符號結束。

反例:_name / __name / $name / name_ / name$ / name__

2、【強制】代碼中的命名嚴禁使用拼音與英文混合的方式,更不允許直接使用中文的方式。

說明:正確的英文拼寫和語法可以讓閱讀者易于理解,避免歧義。注意,純拼音命名方式更要避免采用。

正例:renminbi / alibaba / taobao / youku / hangzhou 等國際通用的名稱,可視同英文。

反例:DaZhePromotion [打折] / getPingfenByName() [評分] / int 某變量 = 3

3、【強制】類名使用 UpperCamelCase 風格,但以下情形例外:DO / BO / DTO / VO / AO

/ PO / UID 等。

正例:JavaServerlessPlatform / UserDO / XmlService / TcpUdpDeal / TaPromotion

反例:javaserverlessplatform / UserDo / XMLService / TCPUDPDeal / TAPromotion

4、【強制】方法名、參數名、成員變量、局部變量都統一使用 lowerCamelCase 風格,必須遵

從駝峰形式。

正例: localValue / getHttpMessage() / inputUserId

5、【強制】常量命名全部大寫,單詞間用下劃線隔開,力求語義表達完整清楚,不要嫌名字

長。

正例:MAX_STOCK_COUNT / CACHE_EXPIRED_TIME

反例:MAX_COUNT / EXPIRED_TIME

6、【強制】抽象類命名使用 Abstract Base 開頭;異常類命名使用 Exception 結尾;測試類

命名以它要測試的類的名稱開始,以 Test 結尾。

7、【強制】類型與中括號緊挨相連來表示數組。

正例:定義整形數組 int[] arrayDemo;

反例: main 參數中,使用 String args[]來定義。

8、【強制】POJO 類中布爾類型變量都不要加 is 前綴,否則部分框架解析會引起序列化錯誤。

說明:在本文 MySQL 規約中的建表約定第一條,表達是與否的值采用 is_xxx的命名方式,所以,需要在

<resultMap>設置從 is_xxx xxx 的映射關系。

反例:定義為基本數據類型 Boolean isDeleted 的屬性,它的方法也是 isDeleted()RPC 框架在反向解

析的時候,誤以為對應的屬性名稱是 deleted,導致屬性獲取不到,進而拋出異常。

9、【強制】包名統一使用小寫,點分隔符之間有且僅有一個自然語義的英語單詞。包名統一使

單數形式,但是類名如果有復數含義,類名可以使用復數形式。

正例:應用工具類包名為 com.alibaba.ai.util、類名為 MessageUtils(此規則參考 spring 的框架結構)

10、【強制】避免在子父類的成員變量之間、或者不同代碼塊的局部變量之間采用完全相同的命

名,使可讀性降低。

說明:子類、父類成員變量名相同,即使是 public 類型的變量也是能夠通過編譯,而局部變量在同一方法

內的不同代碼塊中同名也是合法的,但是要避免使用。對于非 setter/getter 的參數名稱也要避免與成員

變量名稱相同。

反例:

public class ConfusingName {public int age;// 非 setter/getter 的參數名稱,不允許與本類成員變量同名 public void getData(String alibaba) {if(condition) {final int money = 531;// ...}for (int i = 0; i < 10; i++) {// 在同一方法體中,不允許與其它代碼塊中的 money 命名相同final int money = 615;// ...} }}class Son extends ConfusingName {// 不允許與父類的成員變量名稱相同 public int age;}

11、【強制】杜絕完全不規范的縮寫,避免望文不知義。

反例:AbstractClass縮寫命名成 AbsClasscondition縮寫命名成 condi,此類隨意縮寫嚴重

降低了代碼的可閱讀性。

12、【推薦】為了達到代碼自解釋的目標,任何自定義編程元素在命名時,使用盡量完整的單詞

組合來表達其意。

正例: JDK 中,表達原子更新的類名為:AtomicReferenceFieldUpdater

反例:int a 的隨意命名方式。

13、【推薦】在常量與變量的命名時,表示類型的名詞放在詞尾,以提升辨識度。

正例:startTime / workQueue / nameList / TERMINATED_THREAD_COUNT

反例:startedAt / QueueOfWork / listName / COUNT_TERMINATED_THREAD

14、【推薦】如果模塊、接口、類、方法使用了設計模式,在命名時需體現出具體模式。

說明:將設計模式體現在名字中,有利于閱讀者快速理解架構設計理念。

正例: public class OrderFactory;

public class LoginProxy;

public class ResourceObserver;

15、【推薦】接口類中的方法和屬性不要加任何修飾符號(public 也不要加),保持代碼的簡潔

性,并加上有效的 Javadoc 注釋。盡量不要在接口里定義變量,如果一定要定義變量,肯定

是與接口方法相關,并且是整個應用的基礎常量。

正例:接口方法簽名 void commit();

接口基礎常量 String COMPANY = "alibaba";

反例:接口方法定義 public abstract void f();

說明:JDK8 中接口允許有默認實現,那么這個 default 方法,是對所有實現類都有價值的默認實現。

16、接口和實現類的命名有兩套規則:

1【強制】對于 Service DAO 類,基于 SOA 的理念,暴露出來的服務一定是接口,內部的實現類用

Impl 的后綴與接口區別。

正例:CacheServiceImpl 實現 CacheService 接口。

2 【推薦】如果是形容能力的接口名稱,取對應的形容詞為接口名(通常是able 的形容詞)。

正例:AbstractTranslator 實現 Translatable 接口。

17、【參考】枚舉類名帶上 Enum 后綴,枚舉成員名稱需要全大寫,單詞間用下劃線隔開。

說明:枚舉其實就是特殊的類,域成員均為常量,且構造方法被默認強制是私有。

正例:枚舉名字為 ProcessStatusEnum 的成員名稱:SUCCESS / UNKNOWN_REASON

18、【參考】各層命名規約

A) Service/DAO 層方法命名規約

1 獲取單個對象的方法用 get 做前綴。

2 獲取多個對象的方法用 list 做前綴,復數形式結尾如:listObjects

3 獲取統計值的方法用 count 做前綴。

4 插入的方法用 save/insert 做前綴。

5 刪除的方法用 remove/delete 做前綴。

6 修改的方法用 update 做前綴。

B) 領域模型命名規約

1 數據對象:xxxDOxxx 即為數據表名。

2 數據傳輸對象:xxxDTOxxx 為業務領域相關的名稱。

3 展示對象:xxxVOxxx 一般為網頁名稱。

4 POJO DO/DTO/BO/VO 的統稱,禁止命名成 xxxPOJO

常量定義

1、【強制】不允許任何魔法值即未經預先定義的常量直接出現在代碼中。

反例:String key = "Id#taobao_" + tradeId;

cache.put(key, value);

// 緩存 get 時,由于在代碼復制時,漏掉下劃線,導致緩存擊穿而出現問題

2、【強制】 long 或者 Long 賦值時,數值后使用大寫的 L,不能是小寫的 l,小寫容易跟數

1 混淆,造成誤解。

說明:Long a = 2l; 寫的是數字的 21,還是 Long 型的 2

3、【推薦】不要使用一個常量類維護所有常量,要按常量功能進行歸類,分開維護。

說明:大而全的常量類,雜亂無章,使用查找功能才能定位到修改的常量,不利于理解和維護。

正例:緩存相關常量放在類 CacheConsts 下;系統配置相關常量放在類 ConfigConsts 下。

4、【推薦】常量的復用層次有五層:跨應用共享常量、應用內共享常量、子工程內共享常量、

包內共享常量、類內共享常量。

1 跨應用共享常量:放置在二方庫中,通常是 client.jar 中的 constant 目錄下。

2 應用內共享常量:放置在一方庫中,通常是子模塊中的 constant 目錄下。

反例:易懂變量也要統一定義成應用內共享常量,兩位工程師在兩個類中分別定義了YES的變量:

A 中:public static final String YES = "yes";

B 中:public static final String YES = "y";

A.YES.equals(B.YES),預期是 true,但實際返回為 false,導致線上問題。

3 子工程內部共享常量:即在當前子工程的 constant 目錄下。

4 包內共享常量:即在當前包下單獨的 constant 目錄下。

5 類內共享常量:直接在類內部 private static final 定義。

5【推薦】如果變量值僅在一個固定范圍內變化用 enum 類型來定義。

說明:如果存在名稱之外的延伸屬性應使用 enum 類型,下面正例中的數字就是延伸信息,表示一年中的

第幾個季節。

正例:

public enum SeasonEnum {SPRING(1), SUMMER(2), AUTUMN(3), WINTER(4);private int seq; SeasonEnum(int seq) {this.seq = seq;}public int getSeq() {return seq;}}

?

代碼格式

1、【強制】如果是大括號內為空,則簡潔地寫成{}即可,大括號中間無需換行和空格;如果是非

空代碼塊則:

1 左大括號前不換行。

2 左大括號后換行。

3 右大括號前換行。

4 右大括號后還有 else 等代碼則不換行;表示終止的右大括號后必須換行。

2、左小括號和字符之間不出現空格同樣,右小括號和字符之間也不出現空格;而左

大括號前需要空格。詳見第 5 條下方正例提示。

反例:if (空格 a == b 空格)

3、【強制】if/for/while/switch/do 等保留字與括號之間都必須加空格。

4、【強制】任何二目、三目運算符的左右兩邊都需要加一個空格。

說明:運算符包括賦值運算符=、邏輯運算符&&、加減乘除符號等。

5、【強制】采用 4 個空格縮進,禁止使用 tab 字符。

說明:如果使用 tab 縮進,必須設置 1 tab 4 個空格。IDEA 設置 tab 4 個空格時,請勿勾選 Use

tab character;而在 eclipse 中,必須勾選 insert spaces for tabs

正例: (涉及 1-5 點)

public static void main(String[] args) {

// 縮進 4 個空格 String say = "hello";

// 運算符的左右必須有一個空格 int flag = 0;

// 關鍵詞 if 與括號之間必須有一個空格,括號內的 f 與左括號,0 與右括號不需要空格 if (flag == 0) {

System.out.println(say); }

// 左大括號前加空格且不換行;左大括號后換行 if (flag == 1) {

?System.out.println("world");

// 右大括號前換行,右大括號后有 else,不用換行

} else {

System.out.println("ok");

// 在右大括號后直接結束,則必須換行 }

}

6、【強制】注釋的雙斜線與注釋內容之間有且僅有一個空格。

正例:

// 這是示例注釋,請注意在雙斜線之后有一個空格 String param = new String();

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/445309.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/445309.shtml
英文地址,請注明出處:http://en.pswp.cn/news/445309.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PaperNotes(2)-Generative Adversarial Net-代碼實現資料

Generative Adversarial Nets-生成對抗網絡Abstract1.Introduction2.Related work3.Adversarial nets4.Theoretical Results4.1全局最優 pgpdatap_gp_{data}pg?pdata?4.2算法1的收斂性質5.Experiments6.Advantagesa and disadvantages7.Conclusions and future work8.GAN-代碼…

深度學習(05)--典型CNN結構(VGG13,16,19)

文章目錄目錄1.VGG結構2.VGG結構解釋3.3*3卷積核的優點4.VGG的muti-scale方法5.VGG的應用目錄 1.VGG結構 ? LeNet5用大的卷積核來獲取圖像的相似特征 ? AlexNet用99、1111的濾波器 ? VGG 巨大的進展是通過依次采用多個 33 卷積&#xff0c;模仿出更大的感受野&#xff08;r…

redis——發布和訂閱

頻道的訂閱和退訂 當一個客戶端執行 SUBSCRIBE 命令&#xff0c; 訂閱某個或某些頻道的時候&#xff0c; 這個客戶端與被訂閱頻道之間就建立起了一種訂閱關系。 Redis 將所有頻道的訂閱關系都保存在服務器狀態的 pubsub_channels 字典里面&#xff0c; 這個字典的鍵是某個被訂…

Pytorch(1)-內置/自己設計的損失函數使用

內置/自己設計的損失函數使用對比1.內置損失函數2.自己設計損失函數Pytorch內置了許多常用的損失函數&#xff0c;但是&#xff0c;實際應用中&#xff0c;往往需要依據不同的需求設計不同的損失函數。本篇博文對比總結了使用 內置和 自己設計損失函數的語法規則流程。1.內置損…

redis——事務

Redis 事務可以一次執行多個命令&#xff0c; 并且帶有以下三個重要的保證&#xff1a; 批量操作在發送 EXEC 命令前被放入隊列緩存。收到 EXEC 命令后進入事務執行&#xff0c;事務中任意命令執行失敗&#xff0c;其余的命令依然被執行。在事務執行過程&#xff0c;其他客戶端…

深度學習(06)-- Network in Network(NIN)

文章目錄目錄1.NIN 結構2.MLP卷積3.全局均值池化4.總體網絡架構5.NIN補充5.1 廣義線性模型&#xff08;GLM&#xff09;的局限性5.2 CCCP層5.3 1*1卷積核作用&#xff08;補充&#xff09;6.手勢識別RGB圖像--NIN結構目錄 1.NIN 結構 2.MLP卷積 傳統CNN的局部感受野窗口的運算…

Pytorch(2)-tensor常用操作

tensor常用數學操作1. 隨機數1.1 torch.rand() - 均勻分布數字1.2 torch.randn() - 正態分布數字2. 求和2.1 torch.sum(data, dim)2.2 numpy.sum(data, axis)3. 求積3.1 點乘--對應位置相乘3.2 矩陣乘法4. 均值、方差4.1 torch tensor.mean() .std()4.2 numpy array.mean() .st…

Java編程規約(OOP)

1、【強制】避免通過一個類的對象引用訪問此類的靜態變量或靜態方法&#xff0c;無謂增加編譯器解析 成本&#xff0c;直接用類名來訪問即可。 2、【強制】所有的覆寫方法&#xff0c;必須加Override 注解。 說明&#xff1a;getObject()與 get0bject()的問題。一個是字母的…

深度學習(07)-- 經典CNN網絡結構(Inception (v1-v4))

文章目錄目錄1.Inception介紹1.1 Inception結構1.2 Inception V1(GoogleNet)1.3 Inception V2(Batch Norm)1.4 Inception V3&#xff08;Factorization&#xff09;1.5 Inception V4&#xff08;ResNet&#xff09;1.5 Inception v1~v4 總結1.6 Inception進階2.Inception實現目…

Python(13)-函數,lambda語句

函數1 函數定義2 函數調用3 函數注釋文檔4 函數參數4.1 參數列表,默認參數,任意參數4.1.1 無缺省值參數4.1.2&#xff08;部分&#xff09;缺省值參數4.1.3 數量不定形參數4.2 可變對象和不可變對象4.3 作用域4.3.1 globals()函數4.3.2 global 聲明變量為全局變量5 函數返回值5…

深度學習(08)-- Residual Network (ResNet)

文章目錄目錄1.殘差網絡基礎1.1基本概念1.2VGG19、ResNet34結構圖1.3 梯度彌散和網絡退化1.4 殘差塊變體1.5 ResNet模型變體1.6 Residual Network補充1.7 1*1卷積核&#xff08;補充&#xff09;2.殘差網絡介紹&#xff08;何凱明&#xff09;3.ResNet-50(Ng)3.1 非常深的神經網…

Python(14)-模塊

模塊Python標準庫&#xff0c;第三方庫都是一個個模塊&#xff0c;我們還可以編寫自己的模塊。模塊python程序架構的核心模塊&#xff0c;模塊是一個工具包。 每一個以.py為擴展名的源代碼文件都是一個模塊。 想要使用工具包中的工具&#xff0c;可以使用Import的方式導入。 …

redis——命令請求的執行過程

發送命令請求 當用戶在客戶端中鍵入一個命令請求時&#xff0c; 客戶端會將這個命令請求轉換成協議格式&#xff0c; 然后通過連接到服務器的套接字&#xff0c; 將協議格式的命令請求發送給服務器。 讀取命令請求 當客戶端與服務器之間的連接套接字因為客戶端的寫入而變得可…

深度學習(09)-- DenseNet

文章目錄目錄1.DenseNet網絡結構2.稠密連接及其優點3.代碼實現4.補充說明目錄 1.DenseNet網絡結構 2.稠密連接及其優點 每層以之前層的輸出為輸入&#xff0c;對于有L層的傳統網絡&#xff0c;一共有L個連接&#xff0c;對于DenseNet&#xff0c;則有L*(L1)/2。 這篇論文主要…

redis——緩存擊穿/穿透/雪崩

緩存穿透 一般的緩存系統&#xff0c;都是按照key去緩存查詢&#xff0c;如果不存在對應的value&#xff0c;就去后端系統查找&#xff08;比如DB&#xff09;。 一些惡意的請求會故意查詢不存在的key,請求量很大&#xff0c;就會對后端系統造成很大的壓力。這就叫做緩存穿透…

python(15)-window7配置iPython

前提&#xff1a;安裝了Pythonanaconda anaconda安裝參考&#xff1a;https://www.zhihu.com/question/58033789 在window系統下可以使用兩種方法來實現類似與于Linux終端命令運行程序的方法&#xff08;推薦方式2&#xff09;: 1.cmd:自己沒有操作過&#xff0c;可以參考下面…

深度學習(10)-- Capsules Networks(CapsNet)

版權聲明&#xff1a;本文為博主原創文章&#xff0c;未經博主允許不得轉載。 https://blog.csdn.net/malele4th/article/details/79430464 </div><div id"content_views" class"markdown_views"><!-- flowchart 箭頭圖標 勿刪 --&g…

手把手maven的功能/安裝/使用/idea集成

看這篇文章不用著急安裝&#xff0c;跟著步驟一定會成功&#xff0c;要理解maven是什么&#xff0c;如何使用。 介紹 maven官網 對于一個小白來說&#xff0c;官網有用的信息就是這些 不管如何介紹maven&#xff0c;作為使用者來說&#xff0c;主要感覺兩個方面有幫助&#x…

python(16)-列表list,for循環

高級數據類型--列表1列表定義2列表中取值3列表的增&#xff0c;刪&#xff0c;查&#xff0c;改3.1修改指定位置的數據3.2確定指定元素的索引3.3增加操作3.4刪除操作3.5 元素是否存在與列表中 in3.6在指定索引位置插入元素4列表的數據統計5列表排序6列表的循環遍歷-for7多維度l…

深度學習(11)-- GAN

TensorFlow &#xff08;GAN&#xff09; 目錄 TensorFlow &#xff08;GAN&#xff09;目錄1、GAN1.1 常見神經網絡形式1.2 生成網絡1.3 新手畫家 & 新手鑒賞家1.4 GAN網絡1.5 例子 1、GAN 今天我們會來說說現在最流行的一種生成網絡, 叫做 GAN, 又稱生成對抗網絡, 也…