阿里Java編程規約【三】代碼格式

1. 【強制】如果大括號內為空,簡潔地寫成{}即可,大括號中間無需換行和空格;如果是非空代碼塊,則:
1)左大括號前不換行。
2)左大括號后換行。
3)右大括號前換行。
4)右大括號后還有 else 等代碼則不換行;表示終止的右大括號后必須換行。

2. 【強制】左小括號和右邊相鄰字符之間不需要空格;右小括號和左邊相鄰字符之間也不需要空格;而左大 括號前需要加空格。詳見第 5 條下方正例提示。
反例:if(空格 a == b 空格)

3. 【強制】if / for / while / switch / do 等保留字與左右括號之間都必須加空格。

4. 【強制】任何二目、三目運算符的左右兩邊都需要加一個空格。
說明:包括賦值運算符 =、邏輯運算符 &&、加減乘除符號等。

5. 【強制】采用 4 個空格縮進,禁止使用 Tab 字符。

說明:如使用 Tab 縮進,必須設置 1 個 Tab 為 4 個空格。
IDEA 設置 Tab 為 4 個空格時,請勿勾選 Use tab character;
Eclipse 設置中,找到 tab policy 設置為 Spaces only,Tab size:4,最后必須勾選 insert spaces for tabs

正例:(涉及上述中的 1-5 點)

public static void main(String[] args) {
    // 縮進 4 個空格
    String say = "hello";
    // 運算符的左右必須有一個空格
    int flag = 0;
    // 關鍵詞 if 與括號之間必須有一個空格,括號內的 f 與左括號,0 與右括號不需要空格
    if (flag == 0) {
        System.out.println(say);
    }
    // 左大括號前加空格且不換行;左大括號后換行
    if (flag == 1) {
        System.out.println("world");
        // 右大括號前換行,右大括號后有 else,不用換行
    } else {
        System.out.println("ok");
        // 在右大括號后直接結束,則必須換行
    }
}

6. 【強制】注釋的雙斜線與注釋內容之間有且僅有一個空格。
正例:

// 這是示例注釋,請注意在雙斜線之后有一個空格
String commentString = new String("demo");

7. 【強制】在進行類型強制轉換時,右括號與強制轉換值之間不需要任何空格隔開。

正例:

double first = 3.2D;
int second = (int)first + 2;

8. 【強制】單行字符數限制不超過 120 個,超出需要換行,換行時遵循如下原則:

1)第二行相對第一行縮進 4 個空格,從第三行開始,不再繼續縮進,參考示例。
2)運算符與下文一起換行。
3)方法調用的點符號與下文一起換行。
4)方法調用中的多個參數需要換行時,在逗號后進行。
5)在括號前不要換行。

正例:

StringBuilder builder = new StringBuilder();
// 超過 120 個字符的情況下,換行縮進 4 個空格,并且方法前的點號一起換行
builder.append("yang").append("hao")...
    .append("chen")...
    .append("chen")...
    .append("chen");

9.【強制】方法參數在定義和傳入時,多個參數逗號后面必須加空格。

正例:下例中實參的 args1 逗號后邊必須要有一個空格。

method(args1, args2, args3);

10. 【強制】IDE 的 text file encoding 設置為 UTF-8;IDE 中文件的換行符使用 Unix 格式,不要使用 Windows 格式。

11.【推薦】單個方法的總行數不超過 80 行。

說明:除注釋之外的方法簽名、左右大括號、方法內代碼、空行、回車及任何不可見字符的總行數不超過 80 行。

正例:代碼邏輯分清紅花和綠葉,個性和共性,綠葉邏輯單獨出來成為額外方法,使主干代碼更加晰;共性邏輯抽取 成為共性方法,便于復用和維護。

12. 【推薦】沒有必要增加若干空格來使變量的賦值等號與上一行對應位置的等號對齊。
正例:

int a = 3;
long b = 4L;
float c = 5F;
StringBuffer sb = new StringBuffer();

說明:在變量比較多的情況下,是 非常累贅的事情。

13. 【推薦】不同邏輯、不同語義、不同業務的代碼之間插入一個空行,分隔開來以提升可讀性。
說明:任何情形,沒有必要插入多個空行進行隔開。

額外加餐

文檔注釋標簽

Java 語言規范還定義了一種特殊的注釋,叫文檔注釋(doc comment),這種注釋用于編寫代碼 API 的文檔。

  • 以 /** 開頭(不是通常使用的 /*),以 */ 結尾。文檔注釋放在類型或成員定義的前面,其中的內容是那個類型或成員的文檔。
  • 文檔注釋的描述性內容可以包含簡單的 HTML 標記標簽,例如:<i> 用于強調,<code> 用于顯示類、方法和字段的名稱,<pre> 用于顯示多行代碼示例。除此之外,也可以包含 <p> 標簽,把說明分成多個段落;還可以使用 <ul> 和 <li> 等相關標簽,顯示無序列表等結構。不過,要記住,你編寫的內容會嵌入復雜的大型 HTML 文檔,因此,文檔注釋不能包含 HTML 主結構標簽,例如 <h2> 和 <hr>,以防影響那個大型 HTML 文檔的結構。
  • @author name
    添加一個“Author:”條目,內容是指定的名字。每個類和接口定義都應該使用這個標簽,但單個方法和字段一定不能使用。如果一個類有多位作者,在相鄰的幾行中使用多個 @author 標簽。

  • @version text
    插入一個“Version:”條目,內容是指定的文本。例如:
    @version 1.32, 08/26/04
    每個類和接口的文檔注釋中都應該包含這個標簽,但單個方法和字段不能使用。這個標簽經常和支持自動排序版本號的版本控制系統一起使用,例如 git、Perforce 或 SVN。

  • @param parameter-name description
    把指定的參數及其說明添加到當前方法的“Parameters:”區域。在方法和構造方法的文檔注釋中,每個參數都要使用一個 @param 標簽列出,而且應該按照參數傳入方法的順序排列。這個標簽只能出現在方法或構造方法的文檔注釋中。

  • @return description
    插入一個“Returns:”區域,內容是指定的說明。每個方法的文檔注釋中都應該使用這個標簽,除非方法返回 void,或者是構造方法。為了保持簡短,建議使用句子片段。

@return <code>true</code>:成功插入
        <code>false</code>:列表中已經包含要插入的對象
  • @exception full-classname description
    添加一個“Throws:”條目,內容是指定的異常名稱和說明。方法和構造方法的文檔注釋應該為 throws 子句中的每個已檢異常編寫一個 @exception 標簽。如果方法的用戶基于某種原因想捕獲當前方法拋出的未檢異常(即 RuntimeException 的子類),@exception 標簽也可以為這些未檢異常編寫文檔。如果方法能拋出多個異常,要在相鄰的幾行使用多個 @exception 標簽,而且按照異常名稱的字母表順序排列。這個標簽只能出現在方法和構造方法的文檔注釋中。

  • @throws full-classname description
    這個標簽是 @exception 標簽的別名。

  • @see reference
    添加一個“See Also:”條目,內容是指定的引用。這個標簽可以出現在任何文檔注釋中。

  • @deprecated explanation
    這個標簽指明隨后的類型或成員棄用了,應該避免使用。javadoc 會在文檔中添加一個明顯的“Deprecated”條目,內容為指定的 explanation 文本。這個文本應該說明這個類或成員從何時開始棄用,如果可能的話,還要推薦替代的類或成員,并且添加指向替代的類或成員的鏈接。
    一般情況下,javac 會忽略所有注釋,但 @deprecated 標簽是個例外。如果文檔注釋中有這個標簽,編譯器會在生成的類文件中注明棄用信息,提醒其他類,這個功能已經棄用。

  • @since version
    指明類型或成員何時添加到 API 中。這個標簽后面應該跟著版本號或其他形式的版本信息。例如:@since JDK1.0
    每個類型的文檔注釋都應該包含一個 @since 標簽;類型初始版本之后添加的任何成員,都要在其文檔注釋中加上 @since 標簽。

行內文檔注釋標簽

只要能使用 HTML 文本的地方都可以使用行內標簽。因為這些標簽直接出現在 HTML 文本流中,所以要使用花括號把標簽中的內容和周圍的 HTML 文本隔開。javadoc 支持的行內標簽包括如下幾個。

  • {@link reference }
    {@link}標簽和 @see標簽的作用類似,但 @see 標簽是在專門的“See Also:”區域放一個指向引用的鏈接,而 {@link}標簽在行內插入鏈接。在文檔注釋中,只要能使用 HTML 文本的地方都可以使用{@link} 標簽。
    例如: @param regexp 搜索時使用的正則表達式。這個字符串參數使用的句法必須符合{@link java.util.regex.Pattern}制定的規則。

  • {@linkplain reference }
    {@linkplain}標簽和 {@link} 標簽的作用類似,不過,在 {@linkplain} 標簽生成的鏈接中,鏈接文字使用普通的字體,而 {@link} 標簽使用代碼字體。如果 reference 包含要鏈接的 feature 和指明鏈接替代文本的 label,就要使用 {@linkplain} 標簽。

  • {@inheritDoc}
    如果一個方法覆蓋了超類的方法,或者實現了接口中的方法,那么這個方法的文檔注釋可以省略一些內容,讓 javadoc 自動從被覆蓋或被實現的方法中繼承。{@inheritDoc} 標簽可以繼承單個標簽的文本,還能在繼承的基礎上再添加一些說明。繼承單個標簽的方式如下:

@param index @{inheritDoc}
@return @{inheritDoc}
  • {@docRoot}
    這個行內標簽沒有參數,javadoc生成文檔時會把它替換成文檔的根目錄。這個標簽在引用外部文件的超鏈接中很有用,例如引用一張圖片或者一份版權聲明:
    <img src="{@docroot}/images/logo.gif">這份資料受<a href="{@docRoot}/legal.html">版權保護</a>

  • {@literal text }
    這個行內標簽按照字面形式顯示texttext 中的所有 HTML 都會轉義,而且所有javadoc標簽都會被忽略。雖然不保留空白格式,但仍適合在 <pre> 標簽中使用。

  • {@code text }
    這個標簽和 {@literal} 標簽的作用類似,但會使用代碼字體顯示 text 的字面量。

  • {@value}
    沒有參數的 {@value} 標簽在 static final 字段的文檔注釋中使用,會被替換成當前字段的常量值。

  • {@value reference }
    這種 {@value}標簽的變體有一個reference參數,指向一個static final字段,會被替換成指定字段的常量值。

包的文檔注釋

  • javadoc 會在包所在的目錄(存放包中各個類的源碼)中需找一個名為 package.html 的文件,這個文件中的內容就是包的文檔。
  • package.html 文件可以包含簡單的 HTML 格式文檔,也可以使用 @see@link@deprecated@since 標簽。因為 package.html 不是 Java 源碼文件,所以其中的文檔應該是 HTML,而不能是 Java 注釋(即不能包含在 /** 和 */ 之間)。最后,在 package.html 文件中,所有 @see@link 標簽都必須使用完全限定的類名。

類成員的順序

這并沒有唯一的正確解決方案,但如果都使用一致的順序將會提高代碼的可讀性,推薦使用如下排序:

  1. 常量
  2. 字段
  3. 構造函數
  4. 重寫函數和回調
  5. 公有函數
  6. 私有函數
  7. 內部類或接口

舉例如下:

public class MainActivity extends Activity {
    private static final String TAG = MainActivity.class.getSimpleName();
    private String mTitle;
    private TextView mTextViewTitle;
    @Override
    public void onCreate() {
        ...
    }
    public void setTitle(String title) {
        mTitle = title;
    }
    private void setUpView() {
        ...
    }
    static class AnInnerClass {
    }
}

如果類繼承于 Android 組件(例如 Activity 或 Fragment),那么把重寫函數按照他們的生命周期進行排序是一個非常好的習慣,例如,Activity 實現了 onCreate()、onDestroy()、onPause()、onResume(),它的正確排序如下所示:

public class MainActivity extends Activity {
    // Order matches Activity lifecycle
    @Override
    public void onCreate() {...}
    @Override
    public void onResume() {...}
    @Override
    public void onPause() {...}
    @Override
    public void onDestroy() {...}
}

參考

  1. 2022 Java開發手冊(黃山版).pdf
  2. Android 開發規范(完結版) | Blankj's Blog https://blankj.com/2017/03/08/android-standard-dev-final/
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,578評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,701評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,691評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,974評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,694評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,026評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,015評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,193評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,719評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,442評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,668評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,151評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,846評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,255評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,592評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,394評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容