Java編程規(guī)范

本規(guī)范取自《碼出高效—— 阿里巴巴 Java 開發(fā)手冊 1.4.0》第一章蝇闭,略有刪減芯侥。

一焰轻、命名規(guī)范

  1. 代碼中的命名均不能以下劃線或美元符號開始,也不能以下劃線或美元符號結(jié)束聪舒。

  2. 代碼中的命名嚴禁使用拼音與英文混合的方式辨液,更不允許直接使用中文的方式。

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

    正例:alibaba / taobao / youku / hangzhou 等國際通用的名稱燎悍,可視同英文。 反例:DaZhePromotion [打折] / getPingfenByName() [評分] / int 某變量 = 3 
    
  3. 類名使用 UpperCamelCase 風格敷待,但以下情形例外:DO / BO / DTO / VO / AO / PO / UID 等间涵。

    正例: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ù)組 int[] arrayDemo; 
    反例:在 main 參數(shù)中椒舵,使用 String args[]來定義蚂踊。 
    
  8. 包名統(tǒng)一使用小寫,點分隔符之間有且僅有一個自然語義的英語單詞笔宿。包名統(tǒng)一使用 單數(shù)形式犁钟,但是類名如果有復數(shù)含義,類名可以使用復數(shù)形式泼橘。

    正例:應用工具類包名為 com.alibaba.ai.util涝动、類名為 MessageUtils(此規(guī)則參考 spring 的框架結(jié)構(gòu)) 
    
  9. 杜絕完全不規(guī)范的縮寫,避免望文不知義炬灭。

    反例:AbstractClass“縮寫”命名成 AbsClass醋粟;condition“縮寫”命名成 condi,此類隨 意縮寫嚴重降低了代碼的可閱讀性担败。 
    
  10. 為了達到代碼自解釋的目標昔穴,任何自定義編程元素在命名時,使用盡量完整的單詞 組合來表達其意提前。

    正例:在 JDK 中吗货,表達原子更新的類名為:AtomicReferenceFieldUpdater。 
    反例:變量 int a 的隨意命名方式
    
  11. 各層命名規(guī)約:

    A) Service/DAO 層方法命名規(guī)約    
        1) 獲取單個對象的方法用 get 做前綴狈网。   
        2) 獲取多個對象的方法用 list 做前綴宙搬,復數(shù)形式結(jié)尾如:listObjects。    
        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è)務領(lǐng)域相關(guān)的名稱讼积。    
        3) 展示對象:xxxVO,xxx 一般為網(wǎng)頁名稱脚仔。    
        4) POJO 是 DO/DTO/BO/VO 的統(tǒng)稱勤众,禁止命名成 xxxPOJO。 
    

二鲤脏、常量定義

  1. 不允許任何魔法值(即未經(jīng)預先定義的常量)直接出現(xiàn)在代碼中们颜。

     反例:String key = "Id#taobao_" + tradeId;
         cache.put(key, value); 
    
  2. 在 long 或者 Long 賦值時吕朵,數(shù)值后使用大寫的 L,不能是小寫的 l窥突,小寫容易跟數(shù)字 1 混淆努溃,造成誤解。

    說明:Long a = 2l; 寫的是數(shù)字的 21波岛,還是 Long 型的 2? 
    
  3. 不要使用一個常量類維護所有常量茅坛,要按常量功能進行歸類,分開維護则拷。

    說明:大而全的常量類,雜亂無章曹鸠,使用查找功能才能定位到修改的常量煌茬,不利于理解和維護。 
    正例:緩存相關(guān)常量放在類 CacheConsts 下彻桃;系統(tǒng)配置相關(guān)常量放在類 ConfigConsts 下坛善。 
    
  4. 常量的復用層次有五層:跨應用共享常量、應用內(nèi)共享常量邻眷、子工程內(nèi)共享常量眠屎、包 內(nèi)共享常量、類內(nèi)共享常量肆饶。

     1) 跨應用共享常量:放置在二方庫中改衩,通常是 client.jar 中的 constant 目錄下。  
     2) 應用內(nèi)共享常量:放置在一方庫中驯镊,通常是子模塊中的 constant 目錄下葫督。  
         反例:易懂變量也要統(tǒng)一定義成應用內(nèi)共享常量,兩位攻城師在兩個類中分別定義了表示 “是”的變量:     
         類 A 中:public static final String YES = "yes"; 
         類 B 中:public static final String YES = "y";                      A.YES.equals(B.YES)板惑,預期是 true橄镜,但實際返回為 false,導致線上問題冯乘。 
     3) 子工程內(nèi)部共享常量:即在當前子工程的 constant 目錄下洽胶。  
     4) 包內(nèi)共享常量:即在當前包下單獨的 constant 目錄下。  
     5) 類內(nèi)共享常量:直接在類內(nèi)部 private static final 定義裆馒。 
    

三姊氓、代碼格式

  1. 大括號的使用約定。如果是大括號內(nèi)為空领追,則簡潔地寫成{}即可他膳,不需要換行;如果 是非空代碼塊則:

     1) 左大括號前不換行绒窑。  
     2) 左大括號后換行棕孙。  
     3) 右大括號前換行。  
     4) 右大括號后還有 else 等代碼則不換行;表示終止的右大括號后必須換行
    
  2. 左小括號和字符之間不出現(xiàn)空格蟀俊;同樣钦铺,右小括號和字符之間也不出現(xiàn)空格;而左大 括號前需要空格肢预。詳見第 5 條下方正例提示.

    反例:if (空格 a == b 空格) 
    
  3. if/for/while/switch/do 等保留字與括號之間都必須加空格矛洞。

  4. 任何二目、三目運算符的左右兩邊都需要加一個空格烫映。

    說明:運算符包括賦值運算符=沼本、邏輯運算符&&、加減乘除符號等锭沟。 
    
  5. 采用 4 個空格縮進抽兆,禁止使用 tab 字符。

    說明:如果使用 tab 縮進族淮,必須設(shè)置 1 個 tab 為 4 個空格辫红。IDEA 設(shè)置 tab 為 4 個空格時, 請勿勾選 Use tab character祝辣;而在 eclipse 中贴妻,必須勾選 insert spaces for tabs。

    正例:
    public static void main(String[] args) {      
     
     // 縮進 4 個空格      
        String say = "hello";
     // 運算符的左右必須有一個空格      
        int flag = 0;     
     // 關(guān)鍵詞 if 與括號之間必須有一個空格蝙斜,括號內(nèi)的 f 與左括號名惩,0 與右括號不需要空格      
        if (flag == 0) {          
            System.out.println(say);      
        }               
     // 左大括號前加空格且不換行;左大括號后換行      
        if (flag == 1) {          
            System.out.println("world");      
            // 右大括號前換行乍炉,右大括號后有 else绢片,不用換行      
        } else {            
            System.out.println("ok");      
            // 在右大括號后直接結(jié)束,則必須換行      
        }  
    } 
    
  6. 注釋的雙斜線與注釋內(nèi)容之間有且僅有一個空格。

    正例:  
     // 這是示例注釋,請注意在雙斜線之后有一個空格  
     String ygb = new String(); 
    
  7. 單行字符數(shù)限制不超過 120 個震桶,超出需要換行怠噪,換行時遵循如下原則:

    1) 第二行相對第一行縮進 4 個空格,從第三行開始,不再繼續(xù)縮進,參考示例。  
    2) 運算符與下文一起換行祠挫。  
    3) 方法調(diào)用的點符號與下文一起換行。  
    4) 方法調(diào)用中的多個參數(shù)需要換行時悼沿,在逗號后進行等舔。  
    5) 在括號前不要換行,見反例糟趾。
    
    正例: 
     StringBuffer sb = new StringBuffer();  
    // 超過 120 個字符的情況下慌植,換行縮進 4 個空格甚牲,點號和方法名稱一起換行         sb.append("zi").append("xin")...    
         .append("huang")...
         .append("huang")... 
         .append("huang");  
    反例: 
     StringBuffer sb = new StringBuffer();  
    // 超過 120 個字符的情況下,不要在括號前換行                               sb.append("zi").append("xin")...append     
         ("huang");   
     
    // 參數(shù)很多的方法調(diào)用可能超過 120 個字符蝶柿,不要在逗號前換行  
     method(args1, args2, args3, ...      
         , argsX); 
    
  8. 方法參數(shù)在定義和傳入時丈钙,多個參數(shù)逗號后邊必須加空格。

    正例:下例中實參的 args1交汤,后邊必須要有一個空格雏赦。 
     method(args1, args2, args3); 
    
  9. IDE 的 text file encoding 設(shè)置為 UTF-8; IDE 中文件的換行符使用 Unix 格式, 不要使用 Windows 格式芙扎。

  10. 單個方法的總行數(shù)不超過 80 行星岗。

    說明:包括方法簽名、結(jié)束右大括號戒洼、方法內(nèi)代碼伍茄、注釋、空行施逾、回車及任何不可見字符的總 行數(shù)不超過 80 行。 
    正例:代碼邏輯分清紅花和綠葉例获,個性和共性汉额,綠葉邏輯單獨出來成為額外方法,使主干代碼 更加清晰榨汤;共性邏輯抽取成為共性方法蠕搜,便于復用和維護。
    
  11. 沒有必要增加若干空格來使某一行的字符與上一行對應位置的字符對齊收壕。

    正例: 
        int one = 1;
        long two = 2L;  
        float three = 3F;
        StringBuffer sb = new StringBuffer();  
    說明:增加 sb 這個變量妓灌,如果需要對齊,則給 a蜜宪、b虫埂、c 都要增加幾個空格,在變量比較多的 情況下圃验,是非常累贅的事情掉伏。 
    
  12. 不同邏輯、不同語義澳窑、不同業(yè)務的代碼之間插入一個空行分隔開來以提升可讀性斧散。

    說明:任何情形,沒有必要插入多個空行進行隔開摊聋。

四鸡捐、OOP規(guī)約

OOP ——面向?qū)ο蟪绦蛟O(shè)計(Object Oriented Programming)

  1. 避免通過一個類的對象引用訪問此類的靜態(tài)變量或靜態(tài)方法,無謂增加編譯器解析成 本麻裁,直接用類名來訪問即可

  2. 所有的覆寫方法箍镜,必須加@Override 注解源祈。

    說明:getObject()與 get0bject()的問題。一個是字母的 O鹿寨,一個是數(shù)字的 0新博,加@Override 可以準確判斷是否覆蓋成功。另外脚草,如果在抽象類中對方法簽名進行修改赫悄,其實現(xiàn)類會馬上編 譯報錯。

  3. 相同參數(shù)類型馏慨,相同業(yè)務含義埂淮,才可以使用 Java 的可變參數(shù),避免使用 Object写隶。

  說明:可變參數(shù)必須放置在參數(shù)列表的最后倔撞。(提倡同學們盡量不用可變參數(shù)編程) 
   正例:public List<User> listUsers(String type, Long... ids) {...} 
  1. 外部正在調(diào)用或者二方庫依賴的接口,不允許修改方法簽名慕趴,避免對接口調(diào)用方產(chǎn)生 影響痪蝇。接口過時必須加@Deprecated 注解,并清晰地說明采用的新接口或者新服務是什么冕房。

  2. 不能使用過時的類或方法

   說明:java.net.URLDecoder 中的方法 decode(String encodeStr) 這個方法已經(jīng)過時躏啰,應該使用雙參數(shù) decode(String source, String encode)。接口提供方既然明確是過時接口耙册, 那么有義務同時提供新的接口给僵;作為調(diào)用方來說,有義務去考證過時方法的新實現(xiàn)是什么详拙。
  1. Object 的 equals 方法容易拋空指針異常帝际,應使用常量或確定有值的對象來調(diào)用 equals。

    正例:"test".equals(object); 
    反例:object.equals("test"); 
    說明:推薦使用 java.util.Objects#equals(JDK7 引入的工具類) 
    
  2. 所有的相同類型的包裝類對象之間值的比較饶辙,全部使用 equals 方法比較蹲诀。
    說明:對于 Integer var = ? 在-128 至 127 范圍內(nèi)的賦值,Integer 對象是在 IntegerCache.cache 產(chǎn)生畸悬,會復用已有對象侧甫,這個區(qū)間內(nèi)的 Integer 值可以直接使用==進行 判斷,但是這個區(qū)間之外的所有數(shù)據(jù)蹋宦,都會在堆上產(chǎn)生披粟,并不會復用已有對象,這是一個大坑冷冗, 推薦使用 equals 方法進行判斷守屉。

  3. 關(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 風險。  
    反例:比如顯示成交總額漲跌情況裕照,即正負 x%攒发,x 為基本數(shù)據(jù)類型,調(diào)用的 RPC 服務晋南,調(diào)用 不成功時惠猿,返回的是默認值,頁面顯示為 0%负间,這是不合理的偶妖,應該顯示成中劃線。所以包裝 數(shù)據(jù)類型的 null 值政溃,能夠表示額外的信息餐屎,如:遠程調(diào)用失敗,異常退出玩祟。 
    
  4. 構(gòu)造方法里面禁止加入任何業(yè)務邏輯,如果有初始化邏輯屿聋,請放在 init 方法中空扎。

  5. 使用索引訪問用 String 的 split 方法得到的數(shù)組時,需做最后一個分隔符后有無 內(nèi)容的檢查润讥,否則會有拋 IndexOutOfBoundsException 的風險转锈。

    說明: 
        String str = "a,b,c,,";  
        String[] ary = str.split(",");  
        // 預期大于 3,結(jié)果是 3 
        System.out.println(ary.length);
    
  6. 當一個類有多個構(gòu)造方法楚殿,或者多個同名方法撮慨,這些方法應該按順序放置在一起, 便于閱讀.

    類內(nèi)方法定義的順序依次是:公有方法或保護方法 > 私有方法 > getter/setter 方法脆粥。

    說明:公有方法是類的調(diào)用者和維護者最關(guān)心的方法砌溺,首屏展示最好;保護方法雖然只是子類 關(guān)心变隔,也可能是“模板設(shè)計模式”下的核心方法规伐;而私有方法外部一般不需要特別關(guān)心,是一個 黑盒實現(xiàn)匣缘;因為承載的信息價值較低猖闪,所有 Service 和 DAO 的 getter/setter 方法放在類體 最后鲜棠。

  7. setter 方法中,參數(shù)名稱與類成員變量名稱一致培慌,this.成員名 = 參數(shù)名豁陆。在 getter/setter 方法中,不要增加業(yè)務邏輯吵护,增加排查問題的難度盒音。

    反例: 
       public Integer getData() {      
        if (condition) {  
            return this.data + 100;  
        } else { 
            return this.data - 100; 
        }  
    }
    
  1. 循環(huán)體內(nèi),字符串的連接方式何址,使用 StringBuilder 的 append 方法進行擴展里逆。

    說明:下例中,反編譯出的字節(jié)碼文件顯示每次循環(huán)都會 new 出一個 StringBuilder 對象用爪, 然后進行 append 操作原押,最后通過 toString 方法返回 String 對象,造成內(nèi)存資源浪費偎血。 
    反例: 
        String str = "start";      
        for (int i = 0; i < 100; i++) {          
            str = str + "hello";      
        } 
    
    
    
  2. final 可以聲明類诸衔、成員變量、方法颇玷、以及本地變量笨农,下列情況使用 final 關(guān)鍵字。

     1) 不允許被繼承的類帖渠,如:String 類谒亦。  
     2) 不允許修改引用的域?qū)ο蟆? 
     3) 不允許被重寫的方法,如:POJO 類的 setter 方法空郊。
     4) 不允許運行過程中重新賦值的局部變量份招。  
     5) 避免上下文重復使用一個變量,使用 final 描述可以強制重新定義一個變量狞甚,方便更好 地進行重構(gòu).
    
  3. 慎用 Object 的 clone 方法來拷貝對象锁摔。

    說明:對象的 clone 方法默認是淺拷貝,若想實現(xiàn)深拷貝需要重寫 clone 方法實現(xiàn)域?qū)ο蟮?深度遍歷式拷貝哼审。

  4. 類成員與方法訪問控制從嚴:

    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 成員方法或
    成員變量挪圾,刪除一下浅萧,不得手心冒點汗嗎?變量像自己的小孩哲思,盡量在自己的視線內(nèi)洼畅,變量作 用域太大,無限制的到處跑棚赔,那么你會擔心的帝簇。 
    

五、控制語句

  1. 在一個 switch 塊內(nèi)靠益,每個 case 要么通過 break/return 等來終止己儒,要么注釋說明程 序?qū)⒗^續(xù)執(zhí)行到哪一個 case 為止;在一個 switch 塊內(nèi)捆毫,都必須包含一個 default 語句并且 放在最后,即使空代碼冲甘。

  2. 在 if/else/for/while/do 語句中必須使用大括號绩卤。即使只有一行代碼,避免采用 單行的編碼方式:if (condition) statements;

  3. 在高并發(fā)場景中江醇,避免使用”等于”判斷作為中斷或退出的條件濒憋。

    說明:如果并發(fā)控制沒有處理好,容易產(chǎn)生等值判斷被“擊穿”的情況陶夜,使用大于或小于的區(qū)間 判斷條件來代替凛驮。 
    反例:判斷剩余獎品數(shù)量等于 0 時,終止發(fā)放獎品条辟,但因為并發(fā)處理錯誤導致獎品數(shù)量瞬間變 成了負數(shù)黔夭,這樣的話宏胯,活動無法終止。
    
  4. 表達異常的分支時本姥,少用 if-else 方式肩袍,這種方式可以改寫成:

    if (condition) {              
        ...             
        return obj;    
    }   // 接著寫 else 的業(yè)務邏輯代碼;  
    說明:如果非得使用 if()...else if()...else...方式表達邏輯,避免后續(xù)代碼維 護困難婚惫,請勿超過 3 層氛赐。  
    正例:超過 3 層的 if-else 的邏輯判斷代碼可以使用衛(wèi)語句、策略模式先舷、狀態(tài)模式等來實現(xiàn)艰管, 其中衛(wèi)語句示例如下: 
     public void today() {      
         if (isBusy()) {   
                System.out.println(“change time.”);            
                return;      
            } 
     
             if (isFree()) {  
                 System.out.println(“go to travel.”);                            
                return;     
            } 
     
         System.out.println(“stay at home to learn Alibaba Java Coding Guidelines.”);                return; 
     }
    
  5. 除常用方法(如 getXxx/isXxx)等外,不要在條件判斷中執(zhí)行其它復雜的語句蒋川,將 復雜邏輯判斷的結(jié)果賦值給一個有意義的布爾變量名牲芋,以提高可讀性。

    說明:很多 if 語句內(nèi)的邏輯相當復雜尔破,閱讀者需要分析條件表達式的最終結(jié)果街图,才能明確什么 樣的條件執(zhí)行什么樣的語句,那么懒构,如果閱讀者分析邏輯表達式錯誤呢餐济? 
    正例: 
        // 偽代碼如下 
        final boolean existed = (file.open(fileName, "w") != null) && (...) || (...); 
     if (existed) {     
            ... 
        }   
    反例: 
        if ((file.open(fileName, "w") != null) && (...) || (...)) {     
            ... 
        } 
    
  6. 循環(huán)體中的語句要考量性能,以下操作盡量移至循環(huán)體外處理胆剧,如定義對象絮姆、變量、 獲取數(shù)據(jù)庫連接秩霍,進行不必要的 try-catch 操作(這個 try-catch 是否可以移至循環(huán)體外)篙悯。

  7. 避免采用取反邏輯運算符。

     說明:取反邏輯不利于快速理解铃绒,并且取反邏輯寫法必然存在對應的正向邏輯寫法鸽照。 
     正例:使用 if (x < 628) 來表達 x 小于 628。 
     反例:使用 if (!(x >= 628)) 來表達 x 小于 628颠悬。
    

六矮燎、注釋規(guī)約

  1. 類、類屬性赔癌、類方法的注釋必須使用 Javadoc 規(guī)范诞外,使用/**內(nèi)容*/格式,不得使用 // xxx 方式灾票。

    說明:在 IDE 編輯窗口中峡谊,Javadoc 方式會提示相關(guān)注釋,生成 Javadoc 可以正確輸出相應注 釋;在 IDE 中既们,工程調(diào)用方法時濒析,不進入方法即可懸浮提示方法、參數(shù)贤壁、返回值的意義悼枢,提高 閱讀效率。 
    
  2. 所有的抽象方法(包括接口中的方法)必須要用 Javadoc 注釋脾拆、除了返回值馒索、參數(shù)、 異常說明外名船,還必須指出該方法做什么事情绰上,實現(xiàn)什么功能。

    說明:對子類的實現(xiàn)要求渠驼,或者調(diào)用注意事項蜈块,請一并說明。 
    
  3. 所有的類都必須添加創(chuàng)建者和創(chuàng)建日期迷扇。

  4. 方法內(nèi)部單行注釋百揭,在被注釋語句上方另起一行,使用//注釋蜓席。方法內(nèi)部多行注釋 使用/* */注釋器一,注意與代碼對齊。

  5. 所有的枚舉類型字段必須要有注釋厨内,說明每個數(shù)據(jù)項的用途祈秕。

  6. 與其“半吊子”英文來注釋,不如用中文注釋把問題說清楚雏胃。專有名詞與關(guān)鍵字保持 英文原文即可请毛。

  7. 代碼修改的同時,注釋也要進行相應的修改瞭亮,尤其是參數(shù)方仿、返回值、異常统翩、核心邏輯 等的修改仙蚜。

    說明:代碼與注釋更新不同步,就像路網(wǎng)與導航軟件更新不同步一樣唆缴,如果導航軟件嚴重滯后, 就失去了導航的意義黍翎。 
    
  8. 謹慎注釋掉代碼面徽。在上方詳細說明,而不是簡單地注釋掉。如果無用趟紊,則刪除氮双。

    說明:代碼被注釋掉有兩種可能性:1)后續(xù)會恢復此段代碼邏輯。2)永久不用霎匈。前者如果沒 有備注信息戴差,難以知曉注釋動機。后者建議直接刪掉(代碼倉庫保存了歷史代碼)铛嘱。 
    
  9. 對于注釋的要求:第一暖释、能夠準確反應設(shè)計思想和代碼邏輯;第二墨吓、能夠描述業(yè)務含 義球匕,使別的程序員能夠迅速了解到代碼背后的信息。完全沒有注釋的大段代碼對于閱讀者形同天書帖烘,注釋是給自己看的亮曹,即使隔很長時間,也能清晰理解當時的思路秘症;注釋也是給繼任者看 的照卦,使其能夠快速接替自己的工作。

  10. 好的命名乡摹、代碼結(jié)構(gòu)是自解釋的役耕,注釋力求精簡準確、表達到位趟卸。避免出現(xiàn)注釋的 一個極端:過多過濫的注釋蹄葱,代碼的邏輯一旦修改,修改注釋是相當大的負擔锄列。

    反例: 
    // put elephant into fridge  
        put(elephant, fridge);      
    方法名 put图云,加上兩個有意義的變量名 elephant 和 fridge,已經(jīng)說明了這是在干什么邻邮,語 義清晰的代碼不需要額外的注釋竣况。
    
  11. 特殊注釋標記,請注明標記人與標記時間筒严。注意及時處理這些標記丹泉,通過標記掃描, 經(jīng)常清理此類標記鸭蛙。線上故障有時候就是來源于這些標記處的代碼摹恨。

     1) 待辦事宜(TODO):( 標記人,標記時間娶视,[預計處理時間])    
        表示需要實現(xiàn)晒哄,但目前還未實現(xiàn)的功能睁宰。這實際上是一個 Javadoc 的標簽,目前的 Javadoc 還沒有實現(xiàn)寝凌,但已經(jīng)被廣泛使用柒傻。只能應用于類,接口和方法(因為它是一個 Javadoc 標簽)较木。  
     2) 錯誤红符,不能工作(FIXME):(標記人,標記時間伐债,[預計處理時間])    
        在注釋中用 FIXME 標記某代碼是錯誤的预侯,而且不能工作,需要及時糾正的情況泳赋。
    

七雌桑、其他

  1. 在使用正則表達式時,利用好其預編譯功能祖今,可以有效加快正則匹配速度校坑。

    說明:不要在方法體內(nèi)定義:Pattern pattern = Pattern.compile(“規(guī)則”); 
    
  2. 后臺輸送給頁面的變量必須加$!{var}——中間的感嘆號.

    說明:如果 var 等于 null 或者不存在,那么${var}會直接顯示在頁面上千诬。 
    
  3. 注意 Math.random() 這個方法返回是 double 類型耍目,注意取值的范圍 0≤x<1(能夠 取到零值,注意除零異常)徐绑,如果想獲取整數(shù)類型的隨機數(shù)邪驮,不要將 x 放大 10 的若干倍然后 取整,直接使用 Random 對象的 nextInt 或者 nextLong 方法傲茄。

  4. 獲取當前毫秒數(shù) System.currentTimeMillis(); 而不是 new Date().getTime();

    說明:如果想獲取更加精確的納秒級時間值毅访,使用 System.nanoTime()的方式。在 JDK8 中盘榨, 針對統(tǒng)計時間等場景喻粹,推薦使用 Instant 類。
    
  5. 不要在視圖模板中加入任何復雜的邏輯草巡。

    說明:根據(jù) MVC 理論守呜,視圖的職責是展示,不要搶模型和控制器的活山憨。 
    
  6. 任何數(shù)據(jù)結(jié)構(gòu)的構(gòu)造或初始化查乒,都應指定大小,避免數(shù)據(jù)結(jié)構(gòu)無限增長吃光內(nèi)存郁竟。

  7. 及時清理不再使用的代碼段或配置信息玛迄。

    說明:對于垃圾代碼或過時配置,堅決清理干凈棚亩,避免程序過度臃腫蓖议,代碼冗余藻肄。 
    正例:對于暫時被注釋掉,后續(xù)可能恢復使用的代碼片斷拒担,在注釋代碼上方,統(tǒng)一規(guī)定使用三 個斜杠(///)來說明注釋掉代碼的理由
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末攻询,一起剝皮案震驚了整個濱河市从撼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌钧栖,老刑警劉巖低零,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異拯杠,居然都是意外死亡掏婶,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門潭陪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雄妥,“玉大人,你說我怎么就攤上這事依溯±涎幔” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵黎炉,是天一觀的道長枝秤。 經(jīng)常有香客問我,道長慷嗜,這世上最難降的妖魔是什么淀弹? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮庆械,結(jié)果婚禮上薇溃,老公的妹妹穿的比我還像新娘。我一直安慰自己干奢,他們只是感情好痊焊,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著忿峻,像睡著了一般薄啥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上逛尚,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天垄惧,我揣著相機與錄音,去河邊找鬼绰寞。 笑死到逊,一個胖子當著我的面吹牛铣口,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播觉壶,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼脑题,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了铜靶?” 一聲冷哼從身側(cè)響起叔遂,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎争剿,沒想到半個月后已艰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡蚕苇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年哩掺,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涩笤。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡嚼吞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蹬碧,到底是詐尸還是另有隱情誊薄,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布锰茉,位于F島的核電站呢蔫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏飒筑。R本人自食惡果不足惜片吊,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望协屡。 院中可真熱鬧俏脊,春花似錦、人聲如沸肤晓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽补憾。三九已至漫萄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間盈匾,已是汗流浹背腾务。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留削饵,地道東北人岩瘦。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓未巫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親启昧。 傳聞我的和親對象是個殘疾皇子叙凡,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容