1. 程式人生 > >Java程式碼風格和在idea中的一些設定

Java程式碼風格和在idea中的一些設定

原始檔基本設定

1. 檔名

駝峰標識,.java結尾

2. 編碼

統一為UTF-8

Transport…可以解決property檔案不能正常顯示為中文的問題

3. 特殊字元

  • 儘量使用轉義字元(\t, \n等),而不是八進位制的(\012)或者Unicode轉義(\u000a)
  • 非ascii字元,最容易理解,使用unicode字元,比如:μ,不使用轉義:\u03bcs

原始檔結構

  • license
  • package
  • import
  • 一個主類

每一個部分之間用一個空行隔開

1. license

2. 包名

不換行(line-wrapped),一行寫完

3. import

  • import的時候不使用萬用字元*
  • 不單獨區分jdk的import和其他import,只按照靜態引用和非靜態引用分塊
  • 靜態引用、非靜態引用之間用空行分開,各自的塊中間沒有空行

import設定

4. 類

  • 一個檔案只有一個top-level類

格式

1. 大括號(braces)

  • If,lese,if else,for,do,while,這些語句塊都要用大括號
  • 這些關鍵字後面的左大括號前面要有空格(沒有換行),後面換行,右大括號前後都需要換行(如果右大括號後面有一些特殊的語句塊的時候不需要換行,如:else,catch)
  • 如果語句塊是空的,可以簡寫
  // This is acceptable
void doNothing() {} // This is equally acceptable void doNothingElse() { } // This is not acceptable: No concise empty blocks in a multi-block statement try { doSomething(); } catch (Exception e) {}

2. 塊縮排

4個空格

3. 每行一個宣告

  • 變數不要連續宣告
  • 每行一個語句(一個分號)

4. 列長限制120

列外情況:

  1. 不可能遵守的這個規則的情況(比如:URL)
  2. package、import
  3. 註釋裡面的會被拷貝貼上到命令列裡執行的命令

列長限制設定

5. 折行(line-wrapping)

1. 什麼時候折行?

究竟應該在哪裡折行?隨性,一個主要的指導是:最好在語法層面上折行

  1. 如果折行的地方正好是非等號運算子,則在運算子前面折行,包括類似運算子的符號,比如:
    • 點運算子,”.”
    • 泛型,””
  2. 如果折行的地方正好是等號運算子,則在符號後面折行,包括類似等號運算子,比如:
    • foreach的”:”
  3. 方法或者構造方法的名字和左括號(“(“)最好在一行,即方法的左括號後折行
  4. 逗號(“,”)和他前面的部分在一行,逗號後折行
  5. lamda的箭頭後面(的”{“)不換行,除非j方法體部分不需要大括號
MyLambda<String, Long, Object> lambda =
    (String label, Long value, Object obj) -> {
        ...
    };

Predicate<String> predicate = str ->
    longExpressionInvolving(str);

2. 有折行時候的縮排

  • 有折行的情況下,每次折行都至少縮排4個空格(相較於第一行)
  • 如果多次縮排是語法上並行的元素,那麼可以縮排相同,否則在持續縮排中,每次都要增加4個空格
  • 沒有必要為了水平對齊而增加額外的空格

6. 空白

  1. 垂直的空白

    1. 欄位、構造方法、成員方法、內部類、靜態初始化、例項初始化,這些之間用空行隔開
      1. 成員欄位之間不用空行,除非為了邏輯上的分組
      2. enum欄位之間用空行隔開
    2. 為了組織程式碼而進行邏輯分割可以使用空行
    3. 類第一個成員前面不需要空行,最後一個成員後面也不需要空行
  2. 水平空白

    1. 關鍵字後面的小括號(“(“)之間要有一個空格作為分隔,if,for,catch

    2. 關鍵字前面的大括號(“}”)之間要有一個空格作為分隔,else, catch

    3. 左大括號(“{“)前面要有一個空格,兩個例外:

      1. @SomeAnnotation({a, b}) (no space is used)
      2. String[][] x = {{"foo"}}; (no space is required between {{)
    4. 二元或者三元運算子前後都要有空格,包括類似運算子的符號,如:

      1. 泛型中,<T extends Foo & Bar>
      2. foreach中”:”前後
      3. lamda表示式的”->”前後

      但是不包括:

      1. 點運算子”.”
    5. ,:;後面有空格,還有強轉的右括號後面”)”

    6. 行末註釋”//”兩側都需要空格,多個是允許的,但不是必須的

    7. 在變數型別和宣告之間:List list

    8. 陣列初始化的大括號裡面,左大括號後面和右大括號前面的空格不是必須的

    new int[] {5, 6} and new int[] { 5, 6 } are both valid

  3. 水平對齊所需要的空白:不需要

增加維護成本

7. 加上分組用的小括號

便於理解運算順序,而不必記住Java優先順序表

8. 特定的一些構造

  1. enum

    如果元素有構造方法或者一般方法的情況,元素之間可以用空行隔開

    private enum Answer {
     YES {
       @Override public String toString() {
         return "yes";
       }
     },
    
     NO,
     MAYBE
    }

​ 如果沒有構造方法等可以用下面的方式

private enum Suit { CLUBS, HEARTS, SPADES, DIAMONDS }
  1. 變數宣告

    1. 一次宣告一個變數,不要出現如int a, b;
    2. 區域性變數在必要的還是再宣告,保證最小化生命週期
  2. 陣列

    1. 陣列初始化可以當做一個block,例如:
    new int[] {           new int[] {
     0, 1, 2, 3            0,
    }                       1,
                           2,
    new int[] {             3,
     0, 1,               }
     2, 3
    }                     new int[]
                             {0, 1, 2, 3}
    1. 方括號跟在型別後面,方括號和型別共同組成一個型別,String[] arr,而不是String arr[]
  3. switch語句

    1. case縮排4個空格
    2. 冒號後換行
    3. 有穿透的(case沒有break)還是要說明,註釋
    4. 保留default,即使沒有程式碼
  4. 註解

    1. 一個註解單獨一行
  5. 註釋

    多行註釋中第一行和最後一行不寫註釋

    /*
    * This is          // And so           /* Or you can
    * okay.            // is this.          * even do this. */
    */

  6. 修飾詞

    Java中修飾詞的順序

    public protected private abstract default static final transient volatile synchronized native strictfp
  7. 數字字面值

    如果是long型別的字面值,最後加”L”,而不是”l”,如:long length = 1000L;

命名

1. 通用的命名規則

僅僅使用ascii字元和數字,少數情況使用下劃線(比如:常量命名,大寫,多個單詞之間使用下劃線隔開)

2. 每種識別符號對應的命名規則

  1. package:全小寫,不使用下劃線

  2. class:

    1. 使用首字母大寫的駝峰標識
    2. 類名使用名詞或者名詞短語,介面使用名詞或者名詞短語,部分情況使用形容詞(Readable)
    3. 註解沒有指定的規則
    4. 測試類,<被測試的類名>+Test
  3. method:

    1. 方法名首字母小寫的駝峰標識
    2. 方法名是動詞或者動詞短語
    3. 測試方法名稱:test+<被測試的方法名>+
  4. constant:

    1. 全大寫,單詞之間用下劃線隔開
    2. 名詞或者名詞短語
    3. 怎麼才算常量:
      1. static final修飾的原始型別、String、不可變的集合
      2. 物件所有可被訪問的狀態不可變
  5. 非常量欄位命名

    1. 首字母小寫,駝峰標識
    2. 名詞或者名詞短語
  6. 形參名

    1. 首字母小寫,駝峰標識
    2. public方法的引數名不能只有一個字母
  7. 區域性變數命名

    1. 首字母小寫的駝峰標識
    2. 區域性變數即使是不可變的,也不能按照常量的方法來命名
  8. 泛型引數

    下面兩種方式中選一個

    1. 單個大寫字母后面跟上數字
    2. 若泛型有上限,則上限類名後面跟上大寫的T

3. 駝峰標識的具體方法

怎麼將多個單詞或者單詞短語轉換為駝峰標識的命名方法

  1. 將所有的單詞或者短語轉換為ascii,並且刪除中間的任何撇號,如:”Müller’s algorithm”轉換為 “Muellers algorithm”。
  2. 將上面得到的劃分為單詞,使用空格或者標點符號(特別是連字元)作為分界線。如果一個短語有慣常用法,則保留慣常用法,比如:AdWords 轉換為Ad Words
  3. 將得到的字串全部轉換為小寫,然後將劃分後的每一個單詞的首字母大寫(如果是第一個單詞則可能第一個單詞的首字母小寫)
  4. 然後將字串連線起來,去掉空格

一些例子:

需要轉換的字串 正確的
“XML HTTP request” XmlHttpRequest
“new customer ID” newCustomerId
“inner stopwatch” innerStopwatch
“supports IPv6 on iOS?” supportsIpv6OnIos
“YouTube importer” YouTubeImporter YoutubeImporter

程式設計實踐

1. 總是寫@Override

2. 不忽略任何異常

需要catch異常,並做處理,如果沒有必要處理,要用註釋說明

3. 使用類名來引用靜態成員

4. 不重寫Object.finalize

如果非要重寫,請閱讀並理解《Effective Java》裡面避免Finalizer的部分

其他在idea中的設定

換行符

統一為”\n”

設定縮排

縮排

統一為:tab 4 個空格

這裡寫圖片描述

參考