1. 程式人生 > >java程式碼參考規範

java程式碼參考規範

    • 字首
    字首名 描述 舉例
    Abstract 抽象類 AbstractBeanFactory
    Base 基礎類(提供常用方法) BaseDao
    Default 預設類(對某介面的預設實現) DefaultAopProxyFactory
    • 字尾
    字尾名 描述 舉例
    Service 表明這個類是個服務類,裡面包含了給其他類提同業務服務的方法 PaymentOrderService
    Impl 這個類是一個實現類,而不是介面 PaymentOrderServiceImpl
    Dao 這個類封裝了資料訪問方法 PaymentOrderDao
    Listener 響應某種事件的類 PaymentSuccessListener
    Action 直接處理頁面請求,管理頁面邏輯了類 UpdateOrderListAction
    Filter 這個類是過濾器 EncodingFilter
    Event 這個類代表了某種事件 PaymentSuccessEvent
    Servlet 一個Servlet PaymentCallbackServlet
    Factory 生成某種物件工廠的類 PaymentOrderFactory
    Adapter 用來連線某種以前不被支援的物件的類 DatabaseLogAdapter
    Job 某種按時間執行的任務 PaymentOrderCancelJob
    Wrapper 這是一個包裝類,為了給某個類提供沒有的能力 SelectableOrderListWrapper
    Bean 這是一個POJO MenuStateBean
    Exception 異常類 ErrorParametersException

    7.常量命名要全部大寫,單詞間用下劃線分隔,要求語義表達完整,不要嫌名字長。

    8.陣列定義一律採用String[] args這種方式,不可使用String args[]的定義方式。

    9.POJO類中布林型別的變數不要加is,否則部分框架解析會引起序列化錯誤。

    • 正例:boolean success
    • 反例:boolean isSuccess

    10.每一個POJO類要給出toString()方法,便於列印日誌或者查詢bug。

    11.介面類中的方法不要加任何修飾符號,保持程式碼簡潔性。儘量不要在介面中定義變數。

    • 正例:void sayHello()

    • 反例:public void sayHello()

    12.列舉類名建議帶上Enum字尾,列舉成員名稱要全部大寫,單詞間用下劃線隔開。

    • 正例:列舉類名:DealStatusEnum,成員名稱:SUCCESS / UNKNOWN_REASON

    13.Service/Dao層方法命名規約:

      1) 獲取單個物件用get做字首;

      2) 獲取多個物件用list做字首;

      3) 獲取統計值的方法用count做字首;

      4) 插入方法用save或insert做字首;

      5) 刪除方法用remove或delete做字首;

      6) 修改方法用update做字首。

    14.long或者Long型別賦值時,必須使用大寫的L,不能使用小寫的l,避免和數字1造成混淆。

    • 正例:Long a = 2L
    • 反例:Long a = 2l

    15.不要使用一個常量類來維護所有的常量,如果常量過多不利於維護。應該按照常量的功能進行分類,分開定義和維護。比如與快取相關的常量定義在CacheConsts下;系統配置相關的常量定義在ConfigConsts下。

    16.杜絕不規範的縮寫,避免望文不知義。

    • 反例:AbstractClass縮寫為AbsClass,此類隨意的縮寫會嚴重降低程式碼的可閱讀性

    二、格式規約

    1.大括號的使用約定:如果大括號內為空,則直接間接的寫成{},不需要換行;如果是為空程式碼塊,則:

      1) 左大括號前不換行,左大括號後換行;

      2) 右大括號前換行;

      3) 右大括號後還有else等程式碼則不換行。

    2.左括號與後一個字元之間不加空格,右括號與前一個字元之間不加空格。

    3.if/for/while/switch/do等關鍵字與左右括號之間加空格。

    4.任何一個運算子左右兩邊加空格。

      說明:運算子包括賦值運算子=、邏輯運算子&&、加減乘除符號、三目運算子等。

    5.單行字元數不宜超過120個,超出則需要換行,換行是遵循以下規則:

      1) 第二行相對於第一行縮排4個空格,從第三行開始不在繼續縮排;

      2) 運算子與下文一起換行;

      3) 方法呼叫的點號與下文一起換行;

      4) 多個引數超長,在逗號後進行換行;

      5) 在括號前不要換行

    • 正例:

       StringBuffer sb = new StringBuffer();

       sb.append(“a”).append(“b”)...

         .append(“c”)...

         .append(“d”);

    • 反例:

       StringBuffer sb = new StringBuffer();

       sb.append(“a”).append(“b”)...append

         (“c”);

    6.IDE中的text file encoding 設定為UTF-8。

    7.建議方法體內的執行語句組、變數的定義語句組、不同的業務邏輯之間或者不同的語義之間插入一個空行。相同的業務邏輯和語義之間不需要插入空行。

    8.每個檔案不超過2000行,避免將所有方法放到一個類中,影響問題查詢和程式碼閱讀。

    三、編碼規約

    1.不要通過一個類的物件來訪問該類的靜態變數或靜態方法,直接通過類名訪問即可。

    2.不要使用過時的類或者方法。

      說明:java.net.URLDecoder 中的decode(String encodeStr)方法已經過時,應該使用decode(String source,String encode)方法。

    3.Object的equals方法容易產生NPE問題,應該使用常量或者確定有值的物件來呼叫equals。

    • 正例:”test”.equals(object)

    • 反例:object.equals(“test”)

       說明:推薦使用java.util.Objects#equals(JDK7引入的工具類)

    4.所有包裝類物件之間值的比較全部使用equals方法。

    5.基本資料型別與包裝型別的使用標準如下:

      1) 所有的POJO類屬性必須使用包裝型別;

      2) RPC介面的返回值和引數必須使用包裝型別;

      3) 方法中所有的區域性變數使用基本資料型別。

    6.構造方法裡面不要加入任何業務邏輯,如果有業務邏輯,放到init方法中。

    7.當一個類中有多個構造方法或者同名方法時,按照順序放置在一起,便於閱讀。

    8.類方法應最小化訪問許可權。

      說明:能用protected的就不要用public。不要將所有的方法都設為public。

    9.迴圈體內的字串連線使用StringBuilder的append方法。

    10.對集合List迴圈遍歷之前,除非明確該集合肯定不為空,否則一定要做非空判斷。

    11.不要在foreach迴圈裡進行元素的remove/add操作。remove元素請使用Iterator方式,如果併發操作,需要對Iterator物件加鎖。

    12.使用entrySet遍歷Map類集合KV,而不是keySet方式進行遍歷。

    13.利用Set元素唯一的特性,可以快速對一個集合進行去重操作,避免使用List的contains方法進行遍歷、對比、去重操作。

    14.在switch塊內,每一個case要麼通過break/return等來終止,要麼註釋說明程式將執行到哪個case為止;每一個switch都必須包括default並且放在最後,即使什麼程式碼也沒有。

    15.條件語句都必須使用大括號,即使只有一行程式碼,避免使用單行的形式。 \

    • 反例:if ( condition ) statements

    16.表達異常的分支時,少用if-else方式,這種方式可以改寫成:

      If(condition) {

        ......

        return obj;

      }

      //接著寫else的業務邏輯程式碼

      說明:如果非要使用if()...else if()...else...方式表達邏輯,不要超過3層,避免程式碼維護困難。

    17.條件判斷中不要執行過於複雜的語句,將複雜邏輯判斷賦值給一個有意義的布林變數名,以提高可讀性。

    18.迴圈體內的語句要注意考量效能,比如定義物件、變數、獲取資料庫連線、進行不必要的try-catch操作等儘量移至迴圈體外處理。

    19.在類、類屬性、類方法的註釋必須使用javadoc規範,即使用/*內容/格式,不得使用//XXX的方式。

    20.所有的抽象方法(包括介面中的方法)都必須用javadoc註釋,並且說明該方法的功能。

    21.方法內部單行註釋,在被註釋語句上方另起一行,用//註釋;多行註釋使用/* */註釋,與程式碼對齊。

    22.程式碼修改的同時,也要修改相應的註釋,避免程式碼已經修改了多版,但註釋還是第一版,導致註釋與程式碼嚴重不符。

    23.建議任何資料結構的構造或初始化,指定初始化大小。

    24.不要嘗試通過異常來進行流程控制,條件控制,因為異常的處理效率比條件分支低。

    25.不要對大段程式碼進行try-catch。要儘量分清穩定程式碼和非穩定程式碼。

    26.捕獲到異常不要什麼都不做,如果不想處理它,請向上丟擲。

    27.不能在finally塊中使用return,finally塊中的return返回後方法結束,不會再執行try塊中的return語句。

    28.方法如果返回null時,要特別註釋說明什麼情況下會返回null,呼叫者需要進行非空判斷防止NPE問題。

    29.避免出現大量重複性的程式碼。

    30.在方法的有效輸入、輸出和關鍵位置要列印有意義的日誌,對於問題的排查有好處。列印日誌請使用log.info(),避免使用System.out.println()。

    31.資料庫中小數型別為decimal,不要使用float和double。

      說明:float和double在儲存的時候存在精度損失的問題,很可能在值的比較時得不到正確的結果。

    32.程式碼中涉及到小數的運算時,尤其是跟錢有關時,一定要使用BigDecimal進行操作,否則會造成精度缺失,資料錯誤。

    33.方法的引數不宜過多,當超過6個引數時,應將引數封裝成一個類來使用。

    34.異常的捕獲或者丟擲不要都使用java.lang.Exception,要對具體的異常進行細分。

    35.方法中的引數不要在方法體內對其進行重新賦值,要想使用方法中的變數值,要重新定義變數進行賦值。

    36.同一行中不要宣告多個變數。

    • 正例:int a=0;

          Int b=1;

    • 反例:int a=0;b=1;

    37.複寫的方法一定要加@Override註解。

    38.Pojo類中的成員變數不要定義預設值。

    39.一個類中的各個元件定義順序如下:

      靜態變數->私有變數->構造方法->公有方法->保護方法->私有方法->set/get方法

    40.重寫equals方法的同時要重寫hashCode方法。