国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

阿里巴巴Java開發手冊個人整理精簡版(一)

2019-11-11 05:54:26
字體:
來源:轉載
供稿:網友

個人編程時日雖說不短,但整體項目經驗感覺上還是比較欠缺,而且個人的編程風格并未形成,為了使自己的編程更加讓人賞心悅目(而不是傷心)最近看了阿里的java開發編程的規約希望對自己的編程風格有些正面的影響,下面是我的一些筆記和總結: 一、編程規約 (一) 命名規約 1. 【強制】所有編程相關命名均不能以下劃線或美元符號開始,也不能以下劃線或美元符號結束。 反例: _name / __name / Object/name/name / Object$ 2. 【強制】所有編程相關的命名嚴禁使用拼音與英文混合的方式,更不允許直接使用中文的方式。 說明:正確的英文拼寫和語法可以讓閱讀者易于理解,避免歧義。注意,即使純拼音命名方式也要避免采用。 反例: DaZhePRomotion [打折] / getPingfenByName() [評分] / int 變量 = 3; 正例: ali / alibaba / taobao / cainiao / aliyun / youku / hangzhou 等國際通用的名稱,可視為英文。 3. 【強制】類名使用UpperCamelCase風格,必須遵從駝峰形式,但以下情形例外:(領域模型的相關命名)DO / DTO / VO / DAO等。 正例:MarcoPolo / UserDO / xmlService / TcpUdpDeal / TaPromotion 反例:macroPolo / UserDo / XMLService / TCPUDPDeal / TAPromotion 4. 【強制】方法名、參數名、成員變量、局部變量都統一使用lowerCamelCase風格,必須遵從駝峰形式。 正例: localValue / getHttpMessage() / inputUserId 5. 【強制】常量命名全部大寫,單詞間用下劃線隔開,力求語義表達完整清楚,不要嫌名字長。 正例: MAX_STOCK_COUNT 反例: MAX_COUNT 6. 【強制】抽象類命名使用Abstract或Base開頭;異常類命名使用Exception結尾;測試類命名以它要測試的類的名稱開始,以Test結尾。 7. 【強制】中括號是數組類型的一部分,數組定義如下:String[] args; 反例:請勿使用String args[]的方式來定義 8. 【強制】POJO類中的任何布爾類型的變量,都不要加is,否則部分框架解析會引起序列化錯誤。 反例:定義為基本數據類型boolean isSuccess;的屬性,它的方法也是isSuccess(),RPC框架在反向解析的時候,“以為”對應的屬性名稱是success,導致屬性獲取不到,進而拋出異常。 9. 【強制】包名統一使用小寫,點分隔符之間有且僅有一個自然語義的英語單詞。包名統一使用單數形式,但是類名如果有復數含義,類名可以使用復數形式。 正例: 應用工具類包名為com.alibaba.mpp.util、類名為MessageUtils(此規則參考spring的框架結構) 10.【強制】杜絕完全不規范的縮寫,避免望文不知義。 反例:<某業務代碼>AbstractClass“縮寫”命名成AbsClass;condition“縮寫”命名成 condi,此類隨意縮寫嚴重降低了代碼的可閱讀性。 11.【推薦】如果使用到了設計模式,建議在類名中體現出具體模式。 說明:將設計模式體現在名字中,有利于閱讀者快速理解架構設計思想。 正例:public class OrderFactory; public class LoginProxy; public class ResourceObserver; 12.【推薦】接口類中的方法和屬性不要加任何修飾符號(public 也不要加),保持代碼的簡潔性,并加上有效的javadoc注釋。盡量不要在接口里定義變量,如果一定要定義變量,肯定是與接口方法相關,并且是整個應用的基礎常量。 正例: 接口方法簽名:void f(); 接口基礎常量表示:String COMPANY = “alibaba”; 反例: 接口方法定義:public abstract void f(); 說明:JDK8中接口允許有默認實現,那么這個default方法,是對所有實現類都有價值的默認實現。 13.接口和實現類的命名有兩套規則: 1)【強制】對于Service和DAO類,基于SOA的理念,暴露出來的服務一定是接口,內部的實現類用Impl的后綴與接口區別。 正例:CacheServiceImpl實現CacheService接口。 2)【推薦】 如果是形容能力的接口名稱,取對應的形容詞做接口名(通常是–able的形式)。 正例:AbstractTranslator實現 Translatable。 14.【參考】枚舉類名建議帶上Enum后綴,枚舉成員名稱需要全大寫,單詞間用下劃線隔開。 說明:枚舉其實就是特殊的常量類,且構造方法被默認強制是私有。 正例:枚舉名字:DealStatusEnum;成員名稱:SUCCESS / UNKOWN_REASON。 15.【參考】各層命名規約: A) Service/DAO層方法命名規約 1) 獲取單個對象的方法用get做前綴。 2) 獲取多個對象的方法用list做前綴。 3) 獲取統計值的方法用count做前綴。 4) 插入的方法用save(推薦)或insert做前綴。 5) 刪除的方法用remove(推薦)或delete做前綴。 6) 修改的方法用update做前綴。 B) 領域模型命名規約 1) 數據對象:xxxDO,xxx即為數據表名。 2) 數據傳輸對象:xxxDTO,xxx為業務領域相關的名稱。 3) 展示對象:xxxVO,xxx一般為網頁名稱。 4) POJO是DO/DTO/BO/VO的統稱,禁止命名成xxxPOJO。 (二) 常量定義 1. 【強制】不允許出現任何魔法值(即未經定義的常量)直接出現在代碼中。 反例: String key=”Id#taobao_”+tradeId; cache.put(key, value); 2. 【強制】long或者Long初始賦值時,必須使用大寫的L,不能是小寫的l,小寫容易跟數字1混淆,造成誤解。 說明:Long a = 2l; 寫的是數字的21,還是Long型的2? 3. 【推薦】不要使用一個常量類維護所有常量,應該按常量功能進行歸類,分開維護。如:緩存相關的常量放在類:CacheConsts下;系統配置相關的常量放在類:ConfigConsts下。 說明:大而全的常量類,非得ctrl+f才定位到修改的常量,不利于理解,也不利于維護。 4. 【推薦】常量的復用層次有五層:跨應用共享常量、應用內共享常量、子工程內共享常量、包內共享常量、類內共享常量。 1) 跨應用共享常量:放置在二方庫中,通常是client.jar中的const目錄下。 2) 應用內共享常量:放置在一方庫的modules中的const目錄下。 反例:易懂變量也要統一定義成應用內共享常量,兩位攻城師在兩個類中分別定義了表示“是”的變量: 類A中:public static final String YES = “yes”; 類B中:public static final String YES = “y”; A.YES.equals(B.YES),預期是true,但實際返回為false,導致產生線上問題。 3) 子工程內部共享常量:即在當前子工程的const目錄下。 4) 包內共享常量:即在當前包下單獨的const目錄下。 5) 類內共享常量:直接在類內部private static final定義。 5. 【推薦】如果變量值僅在一個范圍內變化用Enum類。如果還帶有名稱之外的延伸屬性,必須使用Enum類,下面正例中的數字就是延伸信息,表示星期幾。 正例:public Enum{ MONDAY(1), TUESDAY(2), WEDNESDAY(3), THURSDAY(4), FRIDAY(5), SATURDAY(6), SUNDAY(7);} (三) 格式規約 1. 【強制】大括號的使用約定。如果是大括號內為空,則簡潔地寫成{}即可,不需要換行;如果是非空代碼塊則: 1) 左大括號前不換行。 2) 左大括號后換行。 3) 右大括號前換行。 4) 右大括號后還有else等代碼則不換行;表示終止右大括號后必須換行。 2. 【強制】 左括號和后一個字符之間不出現空格;同樣,右括號和前一個字符之間也不出現空格。詳見第5條下方正例提示。 3. 【強制】if/for/while/switch/do等保留字與左右括號之間都必須加空格。 4. 【強制】任何運算符左右必須加一個空格。 說明:運算符包括賦值運算符=、邏輯運算符&&、加減乘除符號、三目運行符等。 5. 【強制】代碼塊縮進4個空格,如果使用tab縮進,請設置成1個tab為4個空格。 正例: (涉及1-5點)

public static void main(String args[]) { // 縮進4個空格 String say = "hello"; // 運算符的左右必須有一個空格 int flag = 0; // 關鍵詞if與括號之間必須有一個空格,括號內f與左括號,1與右括號不需要空格 if (flag == 0) { System.out.println(say); } // 左大括號前加空格且不換行;左大括號后換 if (flag == 1) { System.out.println("world"); // 右大括號前換行,右大括號后有else,不用換行 } else { System.out.println("ok"); //右大括號作為結束必須換行 } }【強制】單行字符數限制不超過120個,超出需要換行,換行時,遵循如下原則: 1) 換行時相對上一行縮進4個空格。 2) 運算符與下文一起換行。 3) 方法調用的點符號與下文一起換行。 4) 在多個參數超長,逗號后進行換行。 5) 在括號前不要換行,見反例。 正例:StringBuffer sb = new StringBuffer(); //超過120個字符的情況下,換行縮進4個空格,并且方法前的點符號一起換行sb.append("zi").append("xin")… .append("huang");

反例:

StringBuffer sb = new StringBuffer(); //超過120個字符的情況下,不要在括號前換行 sb.append("zi").append("xin")…append ("huang"); //參數很多的方法調用也超過120個字符,逗號后才是換行處 method(args1, args2, args3, ... , argsX);【強制】方法參數在定義和傳入時,多個參數逗號后邊必須加空格。 正例:下例中實參的”a”,后邊必須要有一個空格。 method(“a”, “b”, “c”);【推薦】沒有必要增加若干空格來使某一行的字符與上一行的相應字符對齊。 正例: int a = 3; long b = 4L; float c = 5F; StringBuffer sb = new StringBuffer(); 說明:增加sb這個變量,如果需要對齊,則給a、b、c都要增加幾個空格,在變量比較多的情況下,是一種累贅的事情。 【強制】IDE的text file encoding設置為UTF-8; IDE中文件的換行符使用Unix格式,不要使用windows格式。 10.【推薦】方法體內的執行語句組、變量的定義語句組、不同的業務邏輯之間或者不同的語義之間插入一個空行。相同業務邏輯和語義之間不需要插入空行。 說明:沒有必要插入多行空格進行隔開。 (四) OOP規約 【強制】避免通過一個類的對象引用訪問此類的靜態變量或靜態方法,無謂增加編譯器解析成本,直接用類名來訪問即可。 【強制】所有的覆寫方法,必須加@Override注解。 反例:getObject()與get0bject()的問題。一個是字母的O,一個是數字的0,加@Override可以準確判斷是否覆蓋成功。另外,如果在抽象類中對方法簽名進行修改,其實現類會馬上編譯報錯。 【強制】相同參數類型,相同業務含義,才可以使用Java的可變參數,避免使用Object。 說明:可變參數必須放置在參數列表的最后。(提倡同學們盡量不用可變參數編程) 正例:public User getUsers(String type, Integer… ids); 【強制】對外暴露的接口簽名,原則上不允許修改方法簽名,避免對接口調用方產生影響。接口過時必須加@Deprecated注解,并清晰地說明采用的新接口或者新服務是什么。 【強制】不能使用過時的類或方法。 說明:java.net.URLDecoder 中的方法decode(String encodeStr) 這個方法已經過時,應該使用雙參數decode(String source, String encode)。接口提供方既然明確是過時接口,那么有義務同時提供新的接口;作為調用方來說,有義務去考證過時方法的新實現是什么。 【強制】Object的equals方法容易拋空指針異常,應使用常量或確定有值的對象來調用equals。 正例: “test”.equals(object); 反例: object.equals(“test”); 說明:推薦使用java.util.Objects#equals (JDK7引入的工具類)【強制】所有的相同類型的包裝類對象之間值的比較,全部使用equals方法比較。 說明:對于Integer var=?在-128至127之間的賦值,Integer對象是在IntegerCache.cache產生,會復用已有對象,這個區間內的Integer值可以直接使用==進行判斷,但是這個區間之外的所有數據,都會在堆上產生,并不會復用已有對象,這是一個大坑,推薦使用equals方法進行判斷。 【強制】關于基本數據類型與包裝數據類型的使用標準如下: 1) 所有的POJO類屬性必須使用包裝數據類型。 2) RPC方法的返回值和參數必須使用包裝數據類型。 3) 所有的局部變量推薦使用基本數據類型。 說明:POJO類屬性沒有初值是提醒使用者在需要使用時,必須自己顯式地進行賦值,任何NPE問題,或者入庫檢查,都由使用者來保證。 正例:數據庫的查詢結果可能是null,因為自動拆箱,用基本數據類型接收有NPE風險。 反例:某業務的交易報表上顯示成交總額漲跌情況,即正負x%,x為基本數據類型,調用的RPC服務,調用不成功時,返回的是默認值,頁面顯示:0%,這是不合理的,應該顯示成中劃線-。所以包裝數據類型的null值,能夠表示額外的信息,如:遠程調用失敗,異常退出。 【強制】定義DO/DTO/VO等POJO類時,不要設定任何屬性默認值。 反例:某業務的DO的gmtCreate默認值為new Date();但是這個屬性在數據提取時并沒有置入具體值,在更新其它字段時又附帶更新了此字段,導致創建時間被修改成當前時間。 10.【強制】序列化類新增屬性時,請不要修改serialVersionUID字段,避免反序列失敗;如果完全不兼容升級,避免反序列化混亂,那么請修改serialVersionUID值。 說明:注意serialVersionUID不一致會拋出序列化運行時異常。 11.【強制】構造方法里面禁止加入任何業務邏輯,如果有初始化邏輯,請放在init方法中。 12.【強制】POJO類必須寫toString方法。使用工具類source> generate toString時,如果繼承了另一個POJO類,注意在前面加一下super.toString。 說明:在方法執行拋出異常時,可以直接調用POJO的toString()方法打印其屬性值,便于排查問題。 【推薦】使用索引訪問用String的split方法得到的數組時,需做最后一個分隔符后有無內容的檢查,否則會有拋IndexOutOfBoundsException的風險。 說明: String str = “a,b,c,,”; String[] ary = str.split(“,”); //預期大于3,結果是3 System.out.println(ary.length); 14.【推薦】當一個類有多個構造方法,或者多個同名方法,這些方法應該按順序放置在一起,便于閱讀。 15.【推薦】 類內方法定義順序依次是:公有方法或保護方法 > 私有方法 > getter/setter方法。 說明:公有方法是類的調用者和維護者最關心的方法,首屏展示最好;保護方法雖然只是子類關心,也可能是“模板設計模式”下的核心方法;而私有方法外部一般不需要特別關心,是一個黑盒實現;因為方法信息價值較低,所有Service和DAO的getter/setter方法放在類體最后。 【推薦】setter方法中,參數名稱與類成員變量名稱一致,this.成員名=參數名。在getter/setter方法中,盡量不要增加業務邏輯,增加排查問題難度。 反例: public Integer getData(){ if(true) { return data + 100; } else { return data - 100; } }【推薦】循環體內,字符串的聯接方式,使用StringBuilder的append方法進行擴展。 說明:反編譯出的字節碼文件顯示每次循環都會new出一個StringBuilder對象,然后進行append操作,最后通過toString方法返回String對象,造成內存資源浪費。 18.【推薦】final可提高程序響應效率,聲明成final的情況: 1) 不需要重新賦值的變量,包括類屬性、局部變量。 2) 對象參數前加final,表示不允許修改引用的指向。 3) 類方法確定不允許被重寫。 19.【推薦】慎用Object的clone方法來拷貝對象。 說明:對象的clone方法默認是淺拷貝,若想實現深拷貝需要重寫clone方法實現屬性對象的拷貝。 20.【推薦】類成員與方法訪問控制從嚴: 1) 如果不允許外部直接通過new來創建對象,那么構造方法必須是private。 2) 工具類不允許有public或default構造方法。 3) 類非static成員變量并且與子類共享,必須是protected。 4) 類非static成員變量并且僅在本類使用,必須是private。 5) 類static成員變量如果僅在本類使用,必須是private。 6) 若是static成員變量,必須考慮是否為final。 7) 類成員方法只供類內部調用,必須是private。 8) 類成員方法只對繼承類公開,那么限制為protected。 說明:任何類、方法、參數、變量,嚴控訪問范圍。過寬泛的訪問范圍,不利于模塊解耦。思考:如果是一個private的方法,想刪除就刪除,可是一個public的Service方法,或者一個public的成員變量,刪除一下,不得手心冒點汗嗎?變量像自己的小孩,盡量在自己的視線內,變量作用域太大,如果無限制的到處跑,那么你會擔心的。 未完待續。。。。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 台东市| 博乐市| 龙井市| 平遥县| 岳阳县| 石楼县| 许昌市| 阿勒泰市| 化州市| 辰溪县| 明溪县| 永嘉县| 六安市| 西平县| 巫山县| 彭州市| SHOW| 岑巩县| 徐闻县| 红桥区| 清丰县| 裕民县| 镇远县| 齐齐哈尔市| 皮山县| 夏邑县| 龙里县| 古蔺县| 澳门| 新民市| 六盘水市| 沈丘县| 丰县| 龙门县| 会昌县| 徐州市| 星子县| 莱州市| 长乐市| 丹寨县| 长寿区|