java代码开发规范
一 ?編碼規范
1.1????? 命名規范
?
?反例: _name / #Object
2. 代碼中的命名嚴禁使用拼音與英文混合的方式,更不允許直接使用中文的方式。
反例: toubao / lipei。
3. 類名使用UpperCamelCase風格,必須遵從駝峰形式。
正例:CommonUtils / BaseVo
4. 方法名、參數名、成員變量、局部變量都統一使用lowerCamelCase風格,必須遵從駝峰形式。
正例: orderService / getOrderService()
5. 常量命名全部大寫,單詞間用下劃線隔開,力求語義表達完整清楚,不要嫌名字長。
正例: ZK_CONFIG_ROOTNODE
6. 抽象類命名使用Abstract或Base開頭;異常類命名使用Exception結尾;測試類命名以它要測試的類的名稱開始,以Test結尾。
7. 包名使用com.hetai.服務名.分層名。
正例: oauth系統的DAO, com.hetai.oauth.dao
8. 如果使用到了設計模式或具有明確職責,建議在類名中體現出具體模式或職責。
正例:ExecutorFactory / AbstractProducer
??????? 9. 各分層都需要接口和實現類,實現類用Impl作后綴與接口區別。
正例:OrderServiceImpl實現OrderService接口。
??????? 10. 枚舉類名建議帶上Enum后綴,枚舉成員名稱需要全大寫,單詞間用下劃線隔開。
正例:枚舉名字:PolicyIdTypeEnum,成員名稱:ID_CARD/ PASSPORT。
11. 各層方法命名規范: 1) 查詢的方法用get/ query做前綴。
2) 插入的方法用add 或insert做前綴。
3) 刪除的方法用remove 或delete做前綴。
4) 修改的方法用modify/ update做前綴。
5) 獲取多個對象的方法用List做結尾。
6) ?獲取統計值的方法用Count做結尾。
12. 全局常量類名建議“模塊名Constant”。
正例:枚舉名字:OrderConstant / CommonConstants。
??????? 13. 不要出現任何魔法值(即未經定義的常量)直接出現在代碼中,應作常量聲明。
反例: return "UNDERWRITE_RESULT_" + order_no;
1.2????? OOP規范
?
說明:注意serialVersionUID不一致會拋出序列化運行時異常。
說明:在方法執行拋出異常時,可以直接調用POJO的toString()方法打印其屬性值,便于排查問題。
2) 對象參數前加final,表示不允許修改引用的指向。
3) 類方法確定不允許被重寫。
10. 使用entrySet遍歷Map類集合KV,而不是keySet方式進行遍歷。 說明:keySet其實是遍歷了2次,一次是轉為Iterator對象,另一次是從hashMap中取出key所對應的value。而entrySet只是遍歷了一次就把key和value都放到了entry中,效率更高。如果是JDK8,使用Map.foreach方法。
正例:values()返回的是V值集合,是一個list集合對象;keySet()返回的是K值集合,是一個Set集合對象;entrySet()返回的是K-V值組合集合
11. 高度注意Map類集合K/V能不能存儲null值的情況,如下表格:
| 集合類 | Key | Value | Super | 說明 |
| Hashtable | 不允許為null | 不允許為null | Dictionary | 線程安全 |
| ConcurrentHashMap | 不允許為null | 不允許為null | AbstractMap | 分段鎖技術 |
| TreeMap | 不允許為null | 允許為null | AbstractMap | 線程不安全 |
| HashMap | 允許為null | 允許為null | AbstractMap | 線程不安全 |
?
1.3????? 控制規范
?
在一個switch塊內,都必須包含一個default語句并且放在最后,即使它什么代碼也沒有。
2) 執行時間開銷很大的方法,參數校驗時間幾乎可以忽略不計,但如果因為參數錯誤導致中間執行回退,或者錯誤,那得不償失。
3) 需要極高穩定性和可用性的方法。
4) 對外提供的開放接口,不管是RPC/API/HTTP接口。
5) 敏感權限入口。
1.4???? 格式規范
?
代碼格式化參考<<eclipse編碼規范約定>>
1.5????? 并發規范
?
正例:注意線程安全,使用DateUtils。亦推薦如下處理:
private static final ThreadLocal<DateFormat> df = new ThreadLocal<DateFormat>() {
@Override
protected DateFormat initialValue() {
return new SimpleDateFormat("yyyy-MM-dd");
}
};
說明:如果是JDK8的應用,可以使用Instant代替Date,LocalDateTime代替Calendar,DateTimeFormatter代替Simpledateformatter,官方給出的解釋:simple beautiful strong immutable thread-safe。
說明:Random實例包括java.util.Random 的實例或者 Math.random()實例。 正例:在JDK7之后,可以直接使用API ThreadLocalRandom,在 JDK7之前,可以做到每個線程一個實例。
10. ThreadLocal無法解決共享對象的更新問題,ThreadLocal對象建議使用static修飾。這個變量是針對一個線程內所有操作共有的,所以設置為靜態變量,所有此類實例共享此靜態變量 ,也就是說在類第一次被使用時裝載,只分配一塊存儲空間,所有此類的對象(只要是這個線程內定義的)都可以操控這個變量;
11. 單例模式推薦使用靜態內部類方式實現, 參考com.hetai.common.util. PropertiesUtils;
二 ?異常規范
2.1 異常規范
?
正例:if(obj != null) {...}
反例:try { obj.method() } catch(NullPointerException e){...};
說明:本規約明確防止NPE是調用者的責任。即使被調用方法返回空集合或者空對象,對調用者來說,也并非高枕無憂,必須考慮到遠程調用失敗,運行時異常等場景返回null的情況;
10. 避免出現重復的代碼(Don’t Repeat Yourself),即DRY原則。 說明:隨意復制和粘貼代碼,必然會導致代碼的重復,在以后需要修改時,需要修改所有的副本,容易遺漏。必要時抽取共性方法,或者抽象公共類,甚至是共用模塊;
?
三 ?日志規范
3.1日志規范
?
正例:<logger name="com.taobao.dubbo.config" additivity="false">;
正例:log.error(各類參數或者對象toString + "_" + e.getMessage(), e);
說明:logger.debug("Processing trade with id: " + id + " symbol: " + symbol); 如果日志級別是warn,上述日志不會打印,但是會執行字符串拼接操作,如果symbol是對象,會執行toString()方法,浪費了系統資源,執行了上述操作,最終日志卻沒有打印;
?
四 工程規范
4.1工程規范
?
| 模塊 | 說明 |
| resource | 服務資源接口層,REST Resource,定義服務對外的REST 接口 |
| service? | 服務業務層,在service組裝業務邏輯? |
| sao????? | 服務遠程方法調用層,封裝調用其他服務接口? |
| dao????? | 服務持久化層,調用DB接口? |
| vo?????? | 服務bean對象? |
| common?? | 服務公共代碼,如工具類、常量類等? |
| mapping? | 調用DB sql配置文件? |
| extension | 過濾器、攔截器filter/Interceptor? |
| handler? | 線程處理實現類,參考《線程池使用指引》? |
?
| 模塊 | 說明 |
| dev | 開發環境配置文件 |
| commit? | 測試環境(api)配置文件 |
| commit_stg2 | 測試環境(api_stg2)配置文件 |
| commit_app | 測試環境(app)配置文件 |
| formal?????? | 正式環境配置文件 |
| formal_app?? | 正式環境(app)配置文件 |
| common | 服務公共配置文件 |
?
?
五 ?安全規范
5.1 安全規范
?
說明:CSRF(Cross-site request forgery)跨站請求偽造是一類常見編程漏洞。對于存在CSRF漏洞的應用/網站,攻擊者可以事先構造好URL,只要受害者用戶一訪問,后臺便在用戶不知情情況下對數據庫中用戶參數進行相應修改;
?
轉載于:https://www.cnblogs.com/heqianjiang/p/9843137.html
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的java代码开发规范的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql四种事务隔离级别
- 下一篇: .net core ef动态orderb