Java代碼風格和在idea中的一些設置

源文件基本設置

1. 文件名

駝峯標識,.java結尾html

2. 編碼

統一爲UTF-8java

Transport...能夠解決property文件不能正常顯示爲中文的問題git

3. 特殊字符

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

源文件結構

  • license
  • package
  • import
  • 一個主類

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

1. license

2. 包名

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

3. import

  • import的時候不使用通配符*
  • 不單獨區分jdk的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

列外狀況:app

  1. 不可能遵照的這個規則的狀況(好比:URL)
  2. package、import
  3. 註釋裏面的會被拷貝粘貼到命令行裏運行的命令

5. 折行(line-wrapping)

1. 何時折行?

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

  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. 水平空白ui

    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 XMLHTTPRequest
"new customer ID" newCustomerId newCustomerID
"inner stopwatch" innerStopwatch innerStopWatch
"supports IPv6 on iOS?" supportsIpv6OnIos supportsIPv6OnIOS
"YouTube importer" YouTubeImporter YoutubeImporter

編程實踐

1. 老是寫@Override

2. 不忽略任何異常

須要catch異常,並作處理,若是沒有必要處理,要用註釋說明

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

4. 不重寫Object.finalize

若是非要重寫,請閱讀並理解《Effective Java》裏面避免Finalizer的部分

其餘在idea中的設置

換行符

統一爲"\n"

縮進

統一爲:tab 4 個空格

參考

Google Java Style Guide

相關文章
相關標籤/搜索