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

首頁 > 編程 > Java > 正文

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

2019-11-11 06:47:04
字體:
供稿:網(wǎng)友

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

public static void main(String args[]) { // 縮進4個空格 String say = "hello"; // 運算符的左右必須有一個空格 int flag = 0; // 關(guān)鍵詞if與括號之間必須有一個空格,括號內(nèi)f與左括號,1與右括號不需要空格 if (flag == 0) { System.out.println(say); } // 左大括號前加空格且不換行;左大括號后換 if (flag == 1) { System.out.println("world"); // 右大括號前換行,右大括號后有else,不用換行 } else { System.out.println("ok"); //右大括號作為結(jié)束必須換行 } }【強制】單行字符數(shù)限制不超過120個,超出需要換行,換行時,遵循如下原則: 1) 換行時相對上一行縮進4個空格。 2) 運算符與下文一起換行。 3) 方法調(diào)用的點符號與下文一起換行。 4) 在多個參數(shù)超長,逗號后進行換行。 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"); //參數(shù)很多的方法調(diào)用也超過120個字符,逗號后才是換行處 method(args1, args2, args3, ... , argsX);【強制】方法參數(shù)在定義和傳入時,多個參數(shù)逗號后邊必須加空格。 正例:下例中實參的”a”,后邊必須要有一個空格。 method(“a”, “b”, “c”);【推薦】沒有必要增加若干空格來使某一行的字符與上一行的相應(yīng)字符對齊。 正例: int a = 3; long b = 4L; float c = 5F; StringBuffer sb = new StringBuffer(); 說明:增加sb這個變量,如果需要對齊,則給a、b、c都要增加幾個空格,在變量比較多的情況下,是一種累贅的事情。 【強制】IDE的text file encoding設(shè)置為UTF-8; IDE中文件的換行符使用Unix格式,不要使用windows格式。 10.【推薦】方法體內(nèi)的執(zhí)行語句組、變量的定義語句組、不同的業(yè)務(wù)邏輯之間或者不同的語義之間插入一個空行。相同業(yè)務(wù)邏輯和語義之間不需要插入空行。 說明:沒有必要插入多行空格進行隔開。 (四) OOP規(guī)約 【強制】避免通過一個類的對象引用訪問此類的靜態(tài)變量或靜態(tài)方法,無謂增加編譯器解析成本,直接用類名來訪問即可。 【強制】所有的覆寫方法,必須加@Override注解。 反例:getObject()與get0bject()的問題。一個是字母的O,一個是數(shù)字的0,加@Override可以準確判斷是否覆蓋成功。另外,如果在抽象類中對方法簽名進行修改,其實現(xiàn)類會馬上編譯報錯。 【強制】相同參數(shù)類型,相同業(yè)務(wù)含義,才可以使用Java的可變參數(shù),避免使用Object。 說明:可變參數(shù)必須放置在參數(shù)列表的最后。(提倡同學們盡量不用可變參數(shù)編程) 正例:public User getUsers(String type, Integer… ids); 【強制】對外暴露的接口簽名,原則上不允許修改方法簽名,避免對接口調(diào)用方產(chǎn)生影響。接口過時必須加@Deprecated注解,并清晰地說明采用的新接口或者新服務(wù)是什么。 【強制】不能使用過時的類或方法。 說明:java.net.URLDecoder 中的方法decode(String encodeStr) 這個方法已經(jīng)過時,應(yīng)該使用雙參數(shù)decode(String source, String encode)。接口提供方既然明確是過時接口,那么有義務(wù)同時提供新的接口;作為調(diào)用方來說,有義務(wù)去考證過時方法的新實現(xiàn)是什么。 【強制】Object的equals方法容易拋空指針異常,應(yīng)使用常量或確定有值的對象來調(diào)用equals。 正例: “test”.equals(object); 反例: object.equals(“test”); 說明:推薦使用java.util.Objects#equals (JDK7引入的工具類)【強制】所有的相同類型的包裝類對象之間值的比較,全部使用equals方法比較。 說明:對于Integer var=?在-128至127之間的賦值,Integer對象是在IntegerCache.cache產(chǎn)生,會復(fù)用已有對象,這個區(qū)間內(nèi)的Integer值可以直接使用==進行判斷,但是這個區(qū)間之外的所有數(shù)據(jù),都會在堆上產(chǎn)生,并不會復(fù)用已有對象,這是一個大坑,推薦使用equals方法進行判斷。 【強制】關(guān)于基本數(shù)據(jù)類型與包裝數(shù)據(jù)類型的使用標準如下: 1) 所有的POJO類屬性必須使用包裝數(shù)據(jù)類型。 2) RPC方法的返回值和參數(shù)必須使用包裝數(shù)據(jù)類型。 3) 所有的局部變量推薦使用基本數(shù)據(jù)類型。 說明:POJO類屬性沒有初值是提醒使用者在需要使用時,必須自己顯式地進行賦值,任何NPE問題,或者入庫檢查,都由使用者來保證。 正例:數(shù)據(jù)庫的查詢結(jié)果可能是null,因為自動拆箱,用基本數(shù)據(jù)類型接收有NPE風險。 反例:某業(yè)務(wù)的交易報表上顯示成交總額漲跌情況,即正負x%,x為基本數(shù)據(jù)類型,調(diào)用的RPC服務(wù),調(diào)用不成功時,返回的是默認值,頁面顯示:0%,這是不合理的,應(yīng)該顯示成中劃線-。所以包裝數(shù)據(jù)類型的null值,能夠表示額外的信息,如:遠程調(diào)用失敗,異常退出。 【強制】定義DO/DTO/VO等POJO類時,不要設(shè)定任何屬性默認值。 反例:某業(yè)務(wù)的DO的gmtCreate默認值為new Date();但是這個屬性在數(shù)據(jù)提取時并沒有置入具體值,在更新其它字段時又附帶更新了此字段,導(dǎo)致創(chuàng)建時間被修改成當前時間。 10.【強制】序列化類新增屬性時,請不要修改serialVersionUID字段,避免反序列失敗;如果完全不兼容升級,避免反序列化混亂,那么請修改serialVersionUID值。 說明:注意serialVersionUID不一致會拋出序列化運行時異常。 11.【強制】構(gòu)造方法里面禁止加入任何業(yè)務(wù)邏輯,如果有初始化邏輯,請放在init方法中。 12.【強制】POJO類必須寫toString方法。使用工具類source> generate toString時,如果繼承了另一個POJO類,注意在前面加一下super.toString。 說明:在方法執(zhí)行拋出異常時,可以直接調(diào)用POJO的toString()方法打印其屬性值,便于排查問題。 【推薦】使用索引訪問用String的split方法得到的數(shù)組時,需做最后一個分隔符后有無內(nèi)容的檢查,否則會有拋IndexOutOfBoundsException的風險。 說明: String str = “a,b,c,,”; String[] ary = str.split(“,”); //預(yù)期大于3,結(jié)果是3 System.out.println(ary.length); 14.【推薦】當一個類有多個構(gòu)造方法,或者多個同名方法,這些方法應(yīng)該按順序放置在一起,便于閱讀。 15.【推薦】 類內(nèi)方法定義順序依次是:公有方法或保護方法 > 私有方法 > getter/setter方法。 說明:公有方法是類的調(diào)用者和維護者最關(guān)心的方法,首屏展示最好;保護方法雖然只是子類關(guān)心,也可能是“模板設(shè)計模式”下的核心方法;而私有方法外部一般不需要特別關(guān)心,是一個黑盒實現(xiàn);因為方法信息價值較低,所有Service和DAO的getter/setter方法放在類體最后。 【推薦】setter方法中,參數(shù)名稱與類成員變量名稱一致,this.成員名=參數(shù)名。在getter/setter方法中,盡量不要增加業(yè)務(wù)邏輯,增加排查問題難度。 反例: public Integer getData(){ if(true) { return data + 100; } else { return data - 100; } }【推薦】循環(huán)體內(nèi),字符串的聯(lián)接方式,使用StringBuilder的append方法進行擴展。 說明:反編譯出的字節(jié)碼文件顯示每次循環(huán)都會new出一個StringBuilder對象,然后進行append操作,最后通過toString方法返回String對象,造成內(nèi)存資源浪費。 18.【推薦】final可提高程序響應(yīng)效率,聲明成final的情況: 1) 不需要重新賦值的變量,包括類屬性、局部變量。 2) 對象參數(shù)前加final,表示不允許修改引用的指向。 3) 類方法確定不允許被重寫。 19.【推薦】慎用Object的clone方法來拷貝對象。 說明:對象的clone方法默認是淺拷貝,若想實現(xiàn)深拷貝需要重寫clone方法實現(xiàn)屬性對象的拷貝。 20.【推薦】類成員與方法訪問控制從嚴: 1) 如果不允許外部直接通過new來創(chuàng)建對象,那么構(gòu)造方法必須是private。 2) 工具類不允許有public或default構(gòu)造方法。 3) 類非static成員變量并且與子類共享,必須是protected。 4) 類非static成員變量并且僅在本類使用,必須是private。 5) 類static成員變量如果僅在本類使用,必須是private。 6) 若是static成員變量,必須考慮是否為final。 7) 類成員方法只供類內(nèi)部調(diào)用,必須是private。 8) 類成員方法只對繼承類公開,那么限制為protected。 說明:任何類、方法、參數(shù)、變量,嚴控訪問范圍。過寬泛的訪問范圍,不利于模塊解耦。思考:如果是一個private的方法,想刪除就刪除,可是一個public的Service方法,或者一個public的成員變量,刪除一下,不得手心冒點汗嗎?變量像自己的小孩,盡量在自己的視線內(nèi),變量作用域太大,如果無限制的到處跑,那么你會擔心的。 未完待續(xù)。。。。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 托克托县| 亚东县| 临沧市| 嘉荫县| 银川市| 都江堰市| 郴州市| 太保市| 武穴市| 长海县| 舟山市| 天柱县| 塔城市| 杂多县| 武宣县| 永泰县| 宁波市| 正蓝旗| 修文县| 临江市| 宜兰县| 南溪县| 酉阳| 同江市| 株洲县| 绵竹市| 景泰县| 灵宝市| 武冈市| 耒阳市| 乐平市| 南安市| 荣成市| 永春县| 屯门区| 万州区| 东方市| 鹤庆县| 扶风县| 建水县| 鹤庆县|