推薦Google的Java編碼規範英文版:html
http://google-styleguide.googlecode.com/svn/trunk/javaguide.htmljava
雖然這篇文章的英文很簡單,可是最近發現有人翻譯了這篇文章,因此專門推薦一下:算法
http://hawstein.com/posts/google-java-style.html數據庫
1、命名規範微信
已經被使用的常量,不要從新定義數據結構
約定俗成的常量含義,不要從新定義。app
努力避免硬編碼。ide
每一個模塊,建議有獨立的常量類。svn
方法名都以lowerCamelCase風格編寫函數
類名都以UpperCamelCase風格編寫
參數名以lowerCamelCase風格編寫
局部變量名以lowerCamelCase風格編寫,比起其它類型的名稱,局部變量名能夠有更爲寬鬆的縮寫。
雖然縮寫更寬鬆,但仍是要避免用單字符進行命名,除了臨時變量和循環變量。
即便局部變量是final和不可改變的,也不該該把它示爲常量,天然也不能用常量的規則去命名它。
2、函數/方法
public 函數(方法),對象參數 必需要處理參數爲null的狀況,
private 函數,對象參數 能夠不用處理參數爲null的狀況(依狀況而定)
方法名都以lowerCamelCase 開頭單詞小寫後面駝峯風格編寫
方法長度不超過50行
3、嵌套層級不要超過3層。
for,while,if ,switch 等。
方法中條件不成立直接return,再也不向下執行
如: public int xxx (String userId, String password, String email){ if(StringUtils.isEmpty(userId) || StringUtils.isEmpty(email) ||StringUtils.isEmpty(password)){ return null; } UserEntity ue = EntityProxy.OBJ.get(userId, UserEntity.class); if(ue == null){ return null; } ……... }
避免前套層次過深,建議不超過三層
4、代碼結構
1垂直
如下狀況須要使用一個空行:
類內連續的成員之間:字段,構造函數,方法,嵌套類,靜態初始化塊,實例初始化塊。
例外:兩個連續字段之間的空行是可選的,用於字段的空行主要用來對字段進行邏輯分組。
在函數體內,語句的邏輯分組間使用空行。
類內的第一個成員前或最後一個成員後的空行是可選的(既不鼓勵也不反對這樣作,視我的喜愛而定)。
要知足本文檔中其餘節的空行要求。
多個連續的空行是容許的,但沒有必要這樣作(咱們也不鼓勵這樣作)。
一個類的整體行數儘可能控制在400行左右(不超過一千行)。
5、資源處理
EntityTransaction tranx = null; try { // 獲取數據庫事務 tranx = em.getTransaction(); // 開始事務過程 if(!tranx.isActive()){ tranx.begin(); } // 保存實體 Query query = em.createNamedQuery(jpqlName); if(params!=null && !params.isEmpty()){ params.forEach((k,v)->{ query.setParameter(k, v); }); } query.executeUpdate(); // 提交事務 tranx.commit(); } catch (Exception ex) { // 記錄錯誤日誌 DaoLog.LOG.error("刪除對象異常"); DaoLog.LOG.error(ex.getMessage(), ex); if(tranx != null){ tranx.rollback(); } return false; }finally{ if(tranx !=null && tranx.isActive()){ tranx.commit(); } em.close();//注意 用完必定要釋放 }
6、異常處理
比較底層的處理單元,建議拋出異常。
業務處理模塊,處理異常的同時,異常必需要加日誌!最好有finally處理。
方法返回結果,不要使用異常方式。
7、相同的代碼快,不要處處出現或者重複出現!
相同代碼提取處理,讓代碼可重用。
8、註釋
一、源文件註釋
源文件註釋採用 /* …… /,在每一個源文件的頭部要有必要的註釋信息,包括:文件名;文件編號;版本號;做者;建立時間;文件描述包括本文件歷史修改記錄等。中文註釋模版:
/**
文 件 名 :
CopyRright (c) 2015-xxxx:
文件編號:
創 建 人:
日 期:
修 改 人:
日 期:
描 述:
版 本 號:
*/
二、類(模塊)註釋:
類(模塊)註釋採用 /* …… /,在每一個類(模塊)的頭部要有必要的註釋信息,包括:工程名;類(模塊)編號;命名空間;類能夠運行的JDK版本;版本號;
做者;建立時間;類(模塊)功能描述(如功能、主要算法、內部各部分之間的關係、該類與其類的關係等,必要時還要有一些如特別的軟硬件要求等說明);
主要函數或過程清單及本類(模塊)歷史修改記錄等。
三、接口註釋:
接口註釋採用 /* …… /,在知足類註釋的基礎之上,接口註釋應該包含描述接口的目的、它應如何被使用以及如何不被使用,塊標記部分必須註明做者和版本。
在接口註釋清楚的前提下對應的實現類能夠不加註釋。
四、構造函數註釋:
構造函數註釋採用 /* …… /,描述部分註明構造函數的做用,不必定有塊標記部分。
五、函數註釋:
函數註釋採用 /* ……/,在每一個函數或者過程的前面要有必要的註釋信息,包括:函數或過程名稱;功能描述;
輸入、輸出及返回值說明;調用關係及被調用關係說明等。函數註釋裏面能夠不出現版本號(@version)。
六、方法註釋:
方法註釋採用 /* …… /,普通成員方法要求說明完成什麼功能,參數含義是什麼且返回值什麼;另外方法的建立時間必須註釋清楚,爲未來的維護和閱讀提供寶貴線索。
七、方法內部註釋:
控制結構,代碼作了些什麼以及爲何這樣作,處理順序等,特別是複雜的邏輯處理部分,要儘量的給出詳細的註釋。
八、全局變量註釋:
要有較詳細的註釋,包括對其功能、取值範圍、哪些函數或者過程存取以及存取時注意事項等的說明。
九、局部(中間)變量註釋:
主要變量必須有註釋,無特別意義的狀況下能夠不加註釋。
十、實參/參數註釋:
參數含義、及其它任何約束或前提條件。
10、if else 條件含義要明確
如: if (isOk) { //isOK 如何 return Response.status(200).entity(resp.getData()).build(); } else { return Response.status(200).entity(resp.getErrorInfo()).build(); }
11、邏輯控制,不要瀑布流!
儘可能把條件不知足的狀況寫在某個邏輯塊的前面(好比方法的最前面),讓不知足條件的狀況快速失敗,讓代碼整理結構清晰,可讀。
12、巧用構造函數構造者builder模式:
構造方法:UserDetailInfo userinfo = new UserDetailInfo(user); builder方式: Map<String, Object> oparams = ImmutableMap.<String, Object> builder() .put("appid", ConfigUtil.APPID)// 服務號的應用號 .put("body", WeixinConstant.PRODUCT_BODY)// 商品描述 .put("mch_id", ConfigUtil.MCH_ID)// 商戶號 ? .put("nonce_str", PayCommonUtil.CreateNoncestr())// 16隨機字符串(大小寫字母加數字) .put("out_trade_no", orderId)// 商品訂單號 .put("total_fee", "1")// 銀行幣種 .put("spbill_create_ip", ip)// IP地址 .put("notify_url", ConfigUtil.NOTIFY_URL) // 微信回調地址 .put("trade_type", "APP")// 支付類型 app .build();
十3、數據結構與業務處理(算法)分開
如: MVC MVVM 均可以參考
十4、關鍵業務添加日誌記錄
LoggerUtils.loginLogger.info(String.format("xx用戶[%s] at %s 登錄xxx app", sb.toString(),DateUtils.getDateTime()));
最後囉嗦一句 :寫代碼一個類寫完了 去掉無效的引用,也就是import的時候。
補充:養成好習慣,祝你們寫好代碼,迎娶白富美,走上人生巔峯!
thx