阿里java代碼規(guī)約(部分)

一、在if/else/for/while/do語句中必須使用大括號徘跪,即使只有一行代碼,避免使用下面的形式:if (condition) statements
二松邪、所有的覆寫方法,必須加@Override注解
三剧辐、避免通過一個類的對象引用訪問此類的靜態(tài)變量或靜態(tài)方法,無謂增加編譯器解析成本荧关,直接用類名來訪問
四、Object的equals方法容易拋空指針異常膝但,應(yīng)使用常量或確定有值的對象來調(diào)用equals甚疟。
五矛辕、不能使用過時的類和方法
六、在一個switch塊內(nèi)孙蒙,每個case要么通過break/return等來終止,要么注釋說明程序?qū)⒗^續(xù)執(zhí)行到哪一個case為止挎峦;在一個switch塊內(nèi)浑测,都必須包含一個default語句并且放在最后歪玲,即使它什么代碼也沒有。
    switch (x) {
        case 1:
            break;
        case 2:
            break;
        default:
    }
七滥崩、對于Service和DAO類钙皮,基于SOA的理念,暴露出來的服務(wù)一定是接口短条,內(nèi)部的實現(xiàn)類用Impl的后綴與接口區(qū)別
    public interface DemoService{
        void f();
    }

    public class DemoServiceImpl implements DemoService {
        @Override
        public void f(){
            System.out.println("hello world");
        }
    }
八、常量命名應(yīng)該全部大寫茸时,單詞間用下劃線隔開,力求語義表達(dá)完整清楚可都,不要嫌名字長
九、所有的枚舉類型字段必須要有注釋旋炒,說明每個數(shù)據(jù)項的用途瘫镇。
    public enum TestEnum {
        /**
         * agree
         */
        agree("agree"),
        /**
         * reject
         */
        reject("reject");
        
        private String action;
    
        TestEnum(String action) {
            this.action = action;
        }
    
        public String getAction() {
            return action;
        }
    }
十汇四、不允許任何魔法值(即未經(jīng)定義的常量)直接出現(xiàn)在代碼中
十一、中括號是數(shù)組類型的一部分
十二序宦、關(guān)于基本數(shù)據(jù)類型與包裝數(shù)據(jù)類型的使用標(biāo)準(zhǔn)如下:
  1. 所有的POJO類屬性必須使用包裝數(shù)據(jù)類型。
  2. RPC方法的返回值和參數(shù)必須使用包裝數(shù)據(jù)類型背苦。
  3. 所有的局部變量推薦使用基本數(shù)據(jù)類型互捌。

說明:POJO類屬性沒有初值是提醒使用者在需要使用時,必須自己顯式地進(jìn)行賦值行剂,任何NPE問題秕噪,或者入庫檢查,都由使用者來保證

十三厚宰、單個方法的總行數(shù)不超過80行腌巾。 說明:除注釋之外的方法簽名、結(jié)束右大括號铲觉、方法內(nèi)代碼澈蝙、空行、回車及任何不可見字符的
十四撵幽、所有的抽象方法(包括接口中的方法)必須要用javadoc注釋灯荧、除了返回值、參數(shù)盐杂、異常說明外厉斟,還必須指出該方法做什么事情捏膨,實現(xiàn)什么功能。 說明:如有實現(xiàn)和調(diào)用注意事項链快,請一并說明
十五域蜗、集合初始化時,指定集合初始值大小丝蹭。 說明:HashMap使用如下構(gòu)造方法進(jìn)行初始化奔穿,如果暫時無法確定集合大小,那么指定默認(rèn)值(16)即可嘴脾。
 Negative example:   
   Map<String, String> map = new HashMap<String, String>();
    
 Positive example: 
   Map<String, String> map = new HashMap<String, String>(16);
十六耗拓、long或者Long初始賦值時,必須使用大寫的L哥谷,不能是小寫的l们妥,小寫容易跟數(shù)字1混淆,造成誤解
Negative example:
    //It is hard to tell whether it is number 11 or Long 1.
    Long warn = 1l;
     
Positive example:
    Long notwarn = 1L;
十七煮盼、所有的包裝類對象之間值的比較僵控,全部使用equals方法比較
十八、獲取當(dāng)前毫秒數(shù):System.currentTimeMillis(); 而不是new Date().getTime()
十九充易、Apache BeanUtils性能較差盹靴,可以使用其他方案比如Spring BeanUtils, Cglib BeanCopier
二十、異常類命名使用Exception結(jié)尾
二十一自赔、必須回收自定義的ThreadLocal變量绍妨,尤其在線程池場景下他去,線程經(jīng)常會被復(fù)用,如果不清理自定義的 ThreadLocal變量,可能會影響后續(xù)業(yè)務(wù)邏輯和造成內(nèi)存泄露等問題秦爆。盡量在代理中使用try-finally塊進(jìn)行回收
二十二爸吮、所有編程相關(guān)的命名均不能以下劃線或美元符號開始
二十三形娇、抽象類命名使用Abstract或Base開頭
二十四、線程資源必須通過線程池提供,不允許在應(yīng)用中自行顯式創(chuàng)建線程丽惶。

說明:使用線程池的好處是減少在創(chuàng)建和銷毀線程上所花的時間以及系統(tǒng)資源的開銷侠驯,解決資源不足的問題吟策。如果不使用線程池着撩,有可能造成系統(tǒng)創(chuàng)建大量同類線程而導(dǎo)致消耗完內(nèi)存或者“過度切換”的問題

二十五、事務(wù)場景中薯鳍,拋出異常被catch后,如果需要回滾壶辜,一定要手動回滾事務(wù)担租。
@Service
    public class UserServiceImpl implements UserService {
        @Autowired
        private DataSourceTransactionManager transactionManager;

        @Override
        @Transactional
        public void save(User user) {
            DefaultTransactionDefinition def = new DefaultTransactionDefinition();
            // explicitly setting the transaction name is something that can only be done programmatically
            def.setName("SomeTxName");
            def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);

            TransactionStatus status = transactionManager.getTransaction(def);
            try {
                // execute your business logic here
                //db operation
            } catch (Exception ex) {
                transactionManager.rollback(status);
                throw ex;
            }
        }
    }
二十六、包名統(tǒng)一使用小寫姿染,點分隔符之間有且僅有一個自然語義的英語單詞。包名統(tǒng)一使用單數(shù)形式,但是類名如果有復(fù)數(shù)含義兵多,類名可以使用復(fù)數(shù)形式
二十七怠褐、定義DO/DTO/VO等POJO類時,不要加任何屬性默認(rèn)值
二十八、循環(huán)體內(nèi)茴丰,字符串的聯(lián)接方式龄寞,使用StringBuilder的append方法進(jìn)行擴(kuò)展滔金。

說明:反編譯出的字節(jié)碼文件顯示每次循環(huán)都會new出一個StringBuilder對象,然后進(jìn)行append操作,最后通過toString方法返回String對象道批,造成內(nèi)存資源浪費

二十九衅金、避免采用取反邏輯運算符。

說明: 取反邏輯不利于快速理解惩琉,并且取反邏輯寫法必然存在對應(yīng)的正向邏輯寫法

三十、除常用方法(如getXxx/isXxx)等外伍玖,不要在條件判斷中執(zhí)行復(fù)雜的語句丽旅,將復(fù)雜邏輯判斷的結(jié)果賦值給一個有意義的布爾變量邪狞,以提高可讀性。

說明:很多if語句內(nèi)的邏輯相當(dāng)復(fù)雜罪郊,閱讀者需要分析條件表達(dá)式的最終結(jié)果癣疟,才能明確什么樣的條件執(zhí)行什么樣的語句,那么扎狱,如果閱讀者分析邏輯表達(dá)式錯誤呢淤击?

Negative example:
    if ((file.open(fileName, "w") != null) && (...) || (...)) {
        // ...
    }
    
Positive example:
    boolean existed = (file.open(fileName, "w") != null) && (...) || (...);
    if (existed) {
        //...
    }
三十绳军、禁止使用構(gòu)造方法BigDecimal(double)的方式把double值轉(zhuǎn)化為BigDecimal對象

說明:反編譯出的字節(jié)碼文件顯示每次循環(huán)都會new出一個StringBuilder對象门驾,然后進(jìn)行append操作咒劲,最后通過toString方法返回String對象诫隅,造成內(nèi)存資源浪費蛔屹。

Negative example:
    BigDecimal good1 = new BigDecimal(0.1);

Positive example:
    BigDecimal good1 = new BigDecimal("0.1");
    BigDecimal good2 = BigDecimal.valueOf(0.1);

----------------- 文章如有問題,請下方回復(fù)指出迅脐,感謝查閱?? -----------------

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市钦睡,隨后出現(xiàn)的幾起案子躁倒,更是在濱河造成了極大的恐慌秧秉,老刑警劉巖挖帘,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件骄崩,死亡現(xiàn)場離奇詭異窿春,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)痴颊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門赏迟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蠢棱,你說我怎么就攤上這事锌杀。” “怎么了泻仙?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵糕再,是天一觀的道長。 經(jīng)常有香客問我玉转,道長突想,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任究抓,我火速辦了婚禮猾担,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘刺下。我一直安慰自己绑嘹,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布橘茉。 她就那樣靜靜地躺著工腋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪畅卓。 梳的紋絲不亂的頭發(fā)上擅腰,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機(jī)與錄音髓介,去河邊找鬼惕鼓。 笑死,一個胖子當(dāng)著我的面吹牛唐础,可吹牛的內(nèi)容都是我干的箱歧。 我是一名探鬼主播矾飞,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼呀邢!你這毒婦竟也來了洒沦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤价淌,失蹤者是張志新(化名)和其女友劉穎申眼,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蝉衣,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡括尸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了病毡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片濒翻。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖啦膜,靈堂內(nèi)的尸體忽然破棺而出有送,到底是詐尸還是另有隱情,我是刑警寧澤僧家,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布雀摘,位于F島的核電站,受9級特大地震影響八拱,放射性物質(zhì)發(fā)生泄漏阵赠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一肌稻、第九天 我趴在偏房一處隱蔽的房頂上張望豌注。 院中可真熱鬧,春花似錦灯萍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至药薯,卻和暖如春绑洛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背童本。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工真屯, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人穷娱。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓绑蔫,卻偏偏與公主長得像运沦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子配深,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,446評論 2 348