一、在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)如下:
- 所有的POJO類屬性必須使用包裝數(shù)據(jù)類型。
- RPC方法的返回值和參數(shù)必須使用包裝數(shù)據(jù)類型背苦。
- 所有的局部變量推薦使用基本數(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ù)指出迅脐,感謝查閱?? -----------------