精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Google Java 編程風(fēng)格指南

開發(fā) 后端
與其它的編程風(fēng)格指南一樣,這里所討論的不僅僅是編碼格式美不美觀的問題, 同時(shí)也討論一些約定及編碼標(biāo)準(zhǔn)。然而,這份文檔主要側(cè)重于我們所普遍遵循的規(guī)則, 對(duì)于那些不是明確強(qiáng)制要求的,我們盡量避免提供意見。

前言

這份文檔是Google Java編程風(fēng)格規(guī)范的完整定義。當(dāng)且僅當(dāng)一個(gè)Java源文件符合此文檔中的規(guī)則, 我們才認(rèn)為它符合Google的Java編程風(fēng)格。

與其它的編程風(fēng)格指南一樣,這里所討論的不僅僅是編碼格式美不美觀的問題, 同時(shí)也討論一些約定及編碼標(biāo)準(zhǔn)。然而,這份文檔主要側(cè)重于我們所普遍遵循的規(guī)則, 對(duì)于那些不是明確強(qiáng)制要求的,我們盡量避免提供意見。

1.1 術(shù)語說明

在本文檔中,除非另有說明:

  1. 術(shù)語class可表示一個(gè)普通類,枚舉類,接口或是annotation類型(@interface)

  2. 術(shù)語comment只用來指代實(shí)現(xiàn)的注釋(implementation comments),我們不使用“documentation comments”一詞,而是用Javadoc。

其他的術(shù)語說明會(huì)偶爾在后面的文檔出現(xiàn)。

1.2 指南說明

本文檔中的示例代碼并不作為規(guī)范。也就是說,雖然示例代碼是遵循Google編程風(fēng)格,但并不意味著這是展現(xiàn)這些代碼的唯一方式。 示例中的格式選擇不應(yīng)該被強(qiáng)制定為規(guī)則。

源文件基礎(chǔ)

2.1 文件名

源文件以其最頂層的類名來命名,大小寫敏感,文件擴(kuò)展名為.java

2.2 文件編碼:UTF-8

源文件編碼格式為UTF-8。

2.3 特殊字符

2.3.1 空白字符

除了行結(jié)束符序列,ASCII水平空格字符(0×20,即空格)是源文件中唯一允許出現(xiàn)的空白字符,這意味著:

  1. 所有其它字符串中的空白字符都要進(jìn)行轉(zhuǎn)義。

  2. 制表符不用于縮進(jìn)。

2.3.2 特殊轉(zhuǎn)義序列

對(duì)于具有特殊轉(zhuǎn)義序列的任何字符(\b, \t, \n, \f, \r, \“, \‘及$$,我們使用它的轉(zhuǎn)義序列,而不是相應(yīng)的八進(jìn)制(比如12)或Unicode(比如\u000a)轉(zhuǎn)義。

2.3.3 非ASCII字符

對(duì)于剩余的非ASCII字符,是使用實(shí)際的Unicode字符(比如∞),還是使用等價(jià)的Unicode轉(zhuǎn)義符(比如\u221e),取決于哪個(gè)能讓代碼更易于閱讀和理解。

Tip: 在使用Unicode轉(zhuǎn)義符或是一些實(shí)際的Unicode字符時(shí),建議做些注釋給出解釋,這有助于別人閱讀和理解。

例如:

String unitAbbrev = "μs";                                 | 贊,即使沒有注釋也非常清晰
String unitAbbrev = "\u03bcs"; // "μs"                    | 允許,但沒有理由要這樣做
String unitAbbrev = "\u03bcs"; // Greek letter mu, "s"    | 允許,但這樣做顯得笨拙還容易出錯(cuò)
String unitAbbrev = "\u03bcs";                            | 很糟,讀者根本看不出這是什么
return '\ufeff' + content; // byte order mark             | Good,對(duì)于非打印字符,使用轉(zhuǎn)義,并在必要時(shí)寫上注釋

Tip: 永遠(yuǎn)不要由于害怕某些程序可能無法正確處理非ASCII字符而讓你的代碼可讀性變差。當(dāng)程序無法正確處理非ASCII字符時(shí),它自然無法正確運(yùn)行, 你就會(huì)去fix這些問題的了。(言下之意就是大膽去用非ASCII字符,如果真的有需要的話)

源文件結(jié)構(gòu)

一個(gè)源文件包含(按順序地):

  1. 許可證或版權(quán)信息(如有需要)

  2. package語句

  3. import語句

  4. 一個(gè)***類(只有一個(gè))

以上每個(gè)部分之間用一個(gè)空行隔開。

3.1 許可證或版權(quán)信息

如果一個(gè)文件包含許可證或版權(quán)信息,那么它應(yīng)當(dāng)被放在文件最前面。

3.2 package語句

package語句不換行,列限制(4.4節(jié))并不適用于package語句。(即package語句寫在一行里)

3.3 import語句

3.3.1 import不要使用通配符

即,不要出現(xiàn)類似這樣的import語句:import java.util.*;

3.3.2 不要換行

import語句不換行,列限制(4.4節(jié))并不適用于import語句。(每個(gè)import語句獨(dú)立成行)

3.3.3 順序和間距

import語句可分為以下幾組,按照這個(gè)順序,每組由一個(gè)空行分隔:

  1. 所有的靜態(tài)導(dǎo)入獨(dú)立成組

  2. com.google imports(僅當(dāng)這個(gè)源文件是在com.google包下)

  3. 第三方的包。每個(gè)***包為一組,字典序。例如:android, com, junit, org, sun

  4. java imports

  5. javax imports

組內(nèi)不空行,按字典序排列。

3.4 類聲明

3.4.1 只有一個(gè)***類聲明

每個(gè)***類都在一個(gè)與它同名的源文件中(當(dāng)然,還包含.java后綴)。

例外:package-info.java,該文件中可沒有package-info類。

3.4.2 類成員順序

類的成員順序?qū)σ讓W(xué)性有很大的影響,但這也不存在唯一的通用法則。不同的類對(duì)成員的排序可能是不同的。 最重要的一點(diǎn),每個(gè)類應(yīng)該以某種邏輯去排序它的成員,維護(hù)者應(yīng)該要能解釋這種排序邏輯。比如, 新的方法不能總是習(xí)慣性地添加到類的結(jié)尾,因?yàn)檫@樣就是按時(shí)間順序而非某種邏輯來排序的。

3.4.2.1 重載:永不分離

當(dāng)一個(gè)類有多個(gè)構(gòu)造函數(shù),或是多個(gè)同名方法,這些函數(shù)/方法應(yīng)該按順序出現(xiàn)在一起,中間不要放進(jìn)其它函數(shù)/方法。

#p#

格式

術(shù)語說明:塊狀結(jié)構(gòu)(block-like construct)指的是一個(gè)類,方法或構(gòu)造函數(shù)的主體。需要注意的是,數(shù)組初始化中的初始值可被選擇性地視為塊狀結(jié)構(gòu)(4.8.3.1節(jié))。

4.1 大括號(hào)

4.1.1 使用大括號(hào)(即使是可選的)

大括號(hào)與if, else, for, do, while語句一起使用,即使只有一條語句(或是空),也應(yīng)該把大括號(hào)寫上。

4.1.2 非空塊:K & R 風(fēng)格

對(duì)于非空塊和塊狀結(jié)構(gòu),大括號(hào)遵循Kernighan和Ritchie風(fēng)格 (Egyptian brackets):

  • 左大括號(hào)前不換行

  • 左大括號(hào)后換行

  • 右大括號(hào)前換行

  • 如果右大括號(hào)是一個(gè)語句、函數(shù)體或類的終止,則右大括號(hào)后換行; 否則不換行。例如,如果右大括號(hào)后面是else或逗號(hào),則不換行。

示例:

return new MyClass() {
  @Override public void method() {
    if (condition()) {
      try {
        something();
      } catch (ProblemException e) {
        recover();
      }
    }
  }
};

4.8.1節(jié)給出了enum類的一些例外。

4.1.3 空塊:可以用簡(jiǎn)潔版本

一個(gè)空的塊狀結(jié)構(gòu)里什么也不包含,大括號(hào)可以簡(jiǎn)潔地寫成{},不需要換行。例外:如果它是一個(gè)多塊語句的一部分(if/else 或 try/catch/finally) ,即使大括號(hào)內(nèi)沒內(nèi)容,右大括號(hào)也要換行。

示例:

void doNothing() {}

4.2 塊縮進(jìn):2個(gè)空格

每當(dāng)開始一個(gè)新的塊,縮進(jìn)增加2個(gè)空格,當(dāng)塊結(jié)束時(shí),縮進(jìn)返回先前的縮進(jìn)級(jí)別。縮進(jìn)級(jí)別適用于代碼和注釋。(見4.1.2節(jié)中的代碼示例)

4.3 一行一個(gè)語句

每個(gè)語句后要換行。

4.4 列限制:80或100

一個(gè)項(xiàng)目可以選擇一行80個(gè)字符或100個(gè)字符的列限制,除了下述例外,任何一行如果超過這個(gè)字符數(shù)限制,必須自動(dòng)換行。

例外:

  1. 不可能滿足列限制的行(例如,Javadoc中的一個(gè)長(zhǎng)URL,或是一個(gè)長(zhǎng)的JSNI方法參考)。

  2. packageimport語句(見3.2節(jié)和3.3節(jié))。

  3. 注釋中那些可能被剪切并粘貼到shell中的命令行。

4.5 自動(dòng)換行

術(shù)語說明:一般情況下,一行長(zhǎng)代碼為了避免超出列限制(80或100個(gè)字符)而被分為多行,我們稱之為自動(dòng)換行(line-wrapping)。

我們并沒有全面,確定性的準(zhǔn)則來決定在每一種情況下如何自動(dòng)換行。很多時(shí)候,對(duì)于同一段代碼會(huì)有好幾種有效的自動(dòng)換行方式。

Tip: 提取方法或局部變量可以在不換行的情況下解決代碼過長(zhǎng)的問題(是合理縮短命名長(zhǎng)度吧)

4.5.1 從哪里斷開

自動(dòng)換行的基本準(zhǔn)則是:更傾向于在更高的語法級(jí)別處斷開。

  1. 如果在非賦值運(yùn)算符處斷開,那么在該符號(hào)前斷開(比如+,它將位于下一行)。注意:這一點(diǎn)與Google其它語言的編程風(fēng)格不同(如C++和JavaScript)。 這條規(guī)則也適用于以下“類運(yùn)算符”符號(hào):點(diǎn)分隔符(.),類型界限中的&(<T extends Foo & Bar>),catch塊中的管道符號(hào)(catch (FooException | BarException e)

  2. 如果在賦值運(yùn)算符處斷開,通常的做法是在該符號(hào)后斷開(比如=,它與前面的內(nèi)容留在同一行)。這條規(guī)則也適用于foreach語句中的分號(hào)。

  3. 方法名或構(gòu)造函數(shù)名與左括號(hào)留在同一行。

  4. 逗號(hào)(,)與其前面的內(nèi)容留在同一行。

4.5.2 自動(dòng)換行時(shí)縮進(jìn)至少+4個(gè)空格

自動(dòng)換行時(shí),***行后的每一行至少比***行多縮進(jìn)4個(gè)空格(注意:制表符不用于縮進(jìn)。見2.3.1節(jié))。

當(dāng)存在連續(xù)自動(dòng)換行時(shí),縮進(jìn)可能會(huì)多縮進(jìn)不只4個(gè)空格(語法元素存在多級(jí)時(shí))。一般而言,兩個(gè)連續(xù)行使用相同的縮進(jìn)當(dāng)且僅當(dāng)它們開始于同級(jí)語法元素。

第4.6.3水平對(duì)齊一節(jié)中指出,不鼓勵(lì)使用可變數(shù)目的空格來對(duì)齊前面行的符號(hào)。

4.6 空白

4.6.1 垂直空白

以下情況需要使用一個(gè)空行:

  1. 類內(nèi)連續(xù)的成員之間:字段,構(gòu)造函數(shù),方法,嵌套類,靜態(tài)初始化塊,實(shí)例初始化塊。

    • 例外:兩個(gè)連續(xù)字段之間的空行是可選的,用于字段的空行主要用來對(duì)字段進(jìn)行邏輯分組。

  2. 在函數(shù)體內(nèi),語句的邏輯分組間使用空行。

  3. 類內(nèi)的***個(gè)成員前或***一個(gè)成員后的空行是可選的(既不鼓勵(lì)也不反對(duì)這樣做,視個(gè)人喜好而定)。

  4. 要滿足本文檔中其他節(jié)的空行要求(比如3.3節(jié):import語句)

多個(gè)連續(xù)的空行是允許的,但沒有必要這樣做(我們也不鼓勵(lì)這樣做)。

4.6.2 水平空白

除了語言需求和其它規(guī)則,并且除了文字,注釋和Javadoc用到單個(gè)空格,單個(gè)ASCII空格也出現(xiàn)在以下幾個(gè)地方:

  1. 分隔任何保留字與緊隨其后的左括號(hào)(()(如if, for catch等)。

  2. 分隔任何保留字與其前面的右大括號(hào)(})(如else, catch)。

  3. 在任何左大括號(hào)前({),兩個(gè)例外:

    • @SomeAnnotation({a, b})(不使用空格)。

    • String[][] x = foo;(大括號(hào)間沒有空格,見下面的Note)。

  4. 在任何二元或三元運(yùn)算符的兩側(cè)。這也適用于以下“類運(yùn)算符”符號(hào):

    • 類型界限中的&(<T extends Foo & Bar>)。

    • catch塊中的管道符號(hào)(catch (FooException | BarException e)。

    • foreach語句中的分號(hào)。

  5. , : ;及右括號(hào)())后

  6. 如果在一條語句后做注釋,則雙斜杠(//)兩邊都要空格。這里可以允許多個(gè)空格,但沒有必要。

  7. 類型和變量之間:List list。

  8. 數(shù)組初始化中,大括號(hào)內(nèi)的空格是可選的,即new int[] {5, 6}new int[] { 5, 6 }都是可以的。

Note:這個(gè)規(guī)則并不要求或禁止一行的開關(guān)或結(jié)尾需要額外的空格,只對(duì)內(nèi)部空格做要求。

4.6.3 水平對(duì)齊:不做要求

術(shù)語說明:水平對(duì)齊指的是通過增加可變數(shù)量的空格來使某一行的字符與上一行的相應(yīng)字符對(duì)齊。

這是允許的(而且在不少地方可以看到這樣的代碼),但Google編程風(fēng)格對(duì)此不做要求。即使對(duì)于已經(jīng)使用水平對(duì)齊的代碼,我們也不需要去保持這種風(fēng)格。

以下示例先展示未對(duì)齊的代碼,然后是對(duì)齊的代碼:

private int x; // this is fine
private Color color; // this too

private int   x;      // permitted, but future edits
private Color color;  // may leave it unaligned

Tip:對(duì)齊可增加代碼可讀性,但它為日后的維護(hù)帶來問題。考慮未來某個(gè)時(shí)候,我們需要修改一堆對(duì)齊的代碼中的一行。 這可能導(dǎo)致原本很漂亮的對(duì)齊代碼變得錯(cuò)位。很可能它會(huì)提示你調(diào)整周圍代碼的空白來使這一堆代碼重新水平對(duì)齊(比如程序員想保持這種水平對(duì)齊的風(fēng)格), 這就會(huì)讓你做許多的無用功,增加了reviewer的工作并且可能導(dǎo)致更多的合并沖突。

4.7 用小括號(hào)來限定組:推薦

除非作者和reviewer都認(rèn)為去掉小括號(hào)也不會(huì)使代碼被誤解,或是去掉小括號(hào)能讓代碼更易于閱讀,否則我們不應(yīng)該去掉小括號(hào)。 我們沒有理由假設(shè)讀者能記住整個(gè)Java運(yùn)算符優(yōu)先級(jí)表。

4.8 具體結(jié)構(gòu)

4.8.1 枚舉類

枚舉常量間用逗號(hào)隔開,換行可選。

沒有方法和文檔的枚舉類可寫成數(shù)組初始化的格式:

private enum Suit { CLUBS, HEARTS, SPADES, DIAMONDS }

由于枚舉類也是一個(gè)類,因此所有適用于其它類的格式規(guī)則也適用于枚舉類。

4.8.2 變量聲明

4.8.2.1 每次只聲明一個(gè)變量

不要使用組合聲明,比如int a, b;

4.8.2.2 需要時(shí)才聲明,并盡快進(jìn)行初始化

不要在一個(gè)代碼塊的開頭把局部變量一次性都聲明了(這是c語言的做法),而是在***次需要使用它時(shí)才聲明。 局部變量在聲明時(shí)***就進(jìn)行初始化,或者聲明后盡快進(jìn)行初始化。

4.8.3 數(shù)組

4.8.3.1 數(shù)組初始化:可寫成塊狀結(jié)構(gòu)

數(shù)組初始化可以寫成塊狀結(jié)構(gòu),比如,下面的寫法都是OK的:

new int[] {
  0, 1, 2, 3
}

new int[] {
  0,
  1,
  2,
  3
}

new int[] {
  0, 1,
  2, 3
}

new int[]
    {0, 1, 2, 3}

4.8.3.2 非C風(fēng)格的數(shù)組聲明

中括號(hào)是類型的一部分:String[] args, 而非String args[]

4.8.4 switch語句

術(shù)語說明:switch塊的大括號(hào)內(nèi)是一個(gè)或多個(gè)語句組。每個(gè)語句組包含一個(gè)或多個(gè)switch標(biāo)簽(case FOO:default:),后面跟著一條或多條語句。

4.8.4.1 縮進(jìn)

與其它塊狀結(jié)構(gòu)一致,switch塊中的內(nèi)容縮進(jìn)為2個(gè)空格。

每個(gè)switch標(biāo)簽后新起一行,再縮進(jìn)2個(gè)空格,寫下一條或多條語句。

4.8.4.2 Fall-through:注釋

在一個(gè)switch塊內(nèi),每個(gè)語句組要么通過break, continue, return或拋出異常來終止,要么通過一條注釋來說明程序?qū)⒗^續(xù)執(zhí)行到下一個(gè)語句組, 任何能表達(dá)這個(gè)意思的注釋都是OK的(典型的是用// fall through)。這個(gè)特殊的注釋并不需要在***一個(gè)語句組(一般是default)中出現(xiàn)。示例:

switch (input) {
  case 1:
  case 2:
    prepareOneOrTwo();
    // fall through
  case 3:
    handleOneTwoOrThree();
    break;
  default:
    handleLargeNumber(input);
}

4.8.4.3 default的情況要寫出來

每個(gè)switch語句都包含一個(gè)default語句組,即使它什么代碼也不包含。

4.8.5 注解(Annotations)

注解緊跟在文檔塊后面,應(yīng)用于類、方法和構(gòu)造函數(shù),一個(gè)注解獨(dú)占一行。這些換行不屬于自動(dòng)換行(第4.5節(jié),自動(dòng)換行),因此縮進(jìn)級(jí)別不變。例如:

@Override
@Nullable
public String getNameIfPresent() { ... }

例外:?jiǎn)蝹€(gè)的注解可以和簽名的***行出現(xiàn)在同一行。例如:

@Override public int hashCode() { ... }

應(yīng)用于字段的注解緊隨文檔塊出現(xiàn),應(yīng)用于字段的多個(gè)注解允許與字段出現(xiàn)在同一行。例如:

@Partial @Mock DataLoader loader;

參數(shù)和局部變量注解沒有特定規(guī)則。

4.8.6 注釋

4.8.6.1 塊注釋風(fēng)格

塊注釋與其周圍的代碼在同一縮進(jìn)級(jí)別。它們可以是/* ... */風(fēng)格,也可以是// ...風(fēng)格。對(duì)于多行的/* ... */注釋,后續(xù)行必須從*開始, 并且與前一行的*對(duì)齊。以下示例注釋都是OK的。

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

注釋不要封閉在由星號(hào)或其它字符繪制的框架里。

Tip:在寫多行注釋時(shí),如果你希望在必要時(shí)能重新?lián)Q行(即注釋像段落風(fēng)格一樣),那么使用/* ... */

4.8.7 Modifiers

類和成員的modifiers如果存在,則按Java語言規(guī)范中推薦的順序出現(xiàn)。

public protected private abstract static final transient volatile synchronized native strictfp

命名約定

5.1 對(duì)所有標(biāo)識(shí)符都通用的規(guī)則

標(biāo)識(shí)符只能使用ASCII字母和數(shù)字,因此每個(gè)有效的標(biāo)識(shí)符名稱都能匹配正則表達(dá)式\w+

在Google其它編程語言風(fēng)格中使用的特殊前綴或后綴,如name_, mName, s_namekName,在Java編程風(fēng)格中都不再使用。

5.2 標(biāo)識(shí)符類型的規(guī)則

5.2.1 包名

包名全部小寫,連續(xù)的單詞只是簡(jiǎn)單地連接起來,不使用下劃線。

5.2.2 類名

類名都以UpperCamelCase風(fēng)格編寫。

類名通常是名詞或名詞短語,接口名稱有時(shí)可能是形容詞或形容詞短語。現(xiàn)在還沒有特定的規(guī)則或行之有效的約定來命名注解類型。

測(cè)試類的命名以它要測(cè)試的類的名稱開始,以Test結(jié)束。例如,HashTestHashIntegrationTest

5.2.3 方法名

方法名都以lowerCamelCase風(fēng)格編寫。

方法名通常是動(dòng)詞或動(dòng)詞短語。

下劃線可能出現(xiàn)在JUnit測(cè)試方法名稱中用以分隔名稱的邏輯組件。一個(gè)典型的模式是:test<MethodUnderTest>_<state>,例如testPop_emptyStack。 并不存在唯一正確的方式來命名測(cè)試方法。

5.2.4 常量名

常量名命名模式為CONSTANT_CASE,全部字母大寫,用下劃線分隔單詞。那,到底什么算是一個(gè)常量?

每個(gè)常量都是一個(gè)靜態(tài)final字段,但不是所有靜態(tài)final字段都是常量。在決定一個(gè)字段是否是一個(gè)常量時(shí), 考慮它是否真的感覺像是一個(gè)常量。例如,如果任何一個(gè)該實(shí)例的觀測(cè)狀態(tài)是可變的,則它幾乎肯定不會(huì)是一個(gè)常量。 只是永遠(yuǎn)不打算改變對(duì)象一般是不夠的,它要真的一直不變才能將它示為常量。

// Constants
static final int NUMBER = 5;
static final ImmutableList<String> NAMES = ImmutableList.of("Ed", "Ann");
static final Joiner COMMA_JOINER = Joiner.on(',');  // because Joiner is immutable
static final SomeMutableType[] EMPTY_ARRAY = {};
enum SomeEnum { ENUM_CONSTANT }

// Not constants
static String nonFinal = "non-final";
final String nonStatic = "non-static";
static final Set<String> mutableCollection = new HashSet<String>();
static final ImmutableSet<SomeMutableType> mutableElements = ImmutableSet.of(mutable);
static final Logger logger = Logger.getLogger(MyClass.getName());
static final String[] nonEmptyArray = {"these", "can", "change"};

這些名字通常是名詞或名詞短語。

5.2.5 非常量字段名

非常量字段名以lowerCamelCase風(fēng)格編寫。

這些名字通常是名詞或名詞短語。

5.2.6 參數(shù)名

參數(shù)名以lowerCamelCase風(fēng)格編寫。

參數(shù)應(yīng)該避免用單個(gè)字符命名。

5.2.7 局部變量名

局部變量名以lowerCamelCase風(fēng)格編寫,比起其它類型的名稱,局部變量名可以有更為寬松的縮寫。

雖然縮寫更寬松,但還是要避免用單字符進(jìn)行命名,除了臨時(shí)變量和循環(huán)變量。

即使局部變量是final和不可改變的,也不應(yīng)該把它示為常量,自然也不能用常量的規(guī)則去命名它。

5.2.8 類型變量名

類型變量可用以下兩種風(fēng)格之一進(jìn)行命名:

  • 單個(gè)的大寫字母,后面可以跟一個(gè)數(shù)字(如:E, T, X, T2)。

  • 以類命名方式(5.2.2節(jié)),后面加個(gè)大寫的T(如:RequestT, FooBarT)。

5.3 駝峰式命名法(CamelCase)

駝峰式命名法分大駝峰式命名法(UpperCamelCase)和小駝峰式命名法(lowerCamelCase)。 有時(shí),我們有不只一種合理的方式將一個(gè)英語詞組轉(zhuǎn)換成駝峰形式,如縮略語或不尋常的結(jié)構(gòu)(例如”IPv6″或”iOS”)。Google指定了以下的轉(zhuǎn)換方案。

名字從散文形式(prose form)開始:

  1. 把短語轉(zhuǎn)換為純ASCII碼,并且移除任何單引號(hào)。例如:”Müller’s algorithm”將變成”Muellers algorithm”。

  2. 把這個(gè)結(jié)果切分成單詞,在空格或其它標(biāo)點(diǎn)符號(hào)(通常是連字符)處分割開。

    • 推薦:如果某個(gè)單詞已經(jīng)有了常用的駝峰表示形式,按它的組成將它分割開(如”AdWords”將分割成”ad words”)。 需要注意的是”iOS”并不是一個(gè)真正的駝峰表示形式,因此該推薦對(duì)它并不適用。

  3. 現(xiàn)在將所有字母都小寫(包括縮寫),然后將單詞的***個(gè)字母大寫:

    • 每個(gè)單詞的***個(gè)字母都大寫,來得到大駝峰式命名。

    • 除了***個(gè)單詞,每個(gè)單詞的***個(gè)字母都大寫,來得到小駝峰式命名。

  4. ***將所有的單詞連接起來得到一個(gè)標(biāo)識(shí)符。

示例:

Prose form                Correct               Incorrect
------------------------------------------------------------------
"XML HTTP request"        XmlHttpRequest        XMLHTTPRequest
"new customer ID"         newCustomerId         newCustomerID
"inner stopwatch"         innerStopwatch        innerStopWatch
"supports IPv6 on iOS?"   supportsIpv6OnIos     supportsIPv6OnIOS
"YouTube importer"        YouTubeImporter
                          YoutubeImporter*

加星號(hào)處表示可以,但不推薦。

Note:在英語中,某些帶有連字符的單詞形式不唯一。例如:”nonempty”和”non-empty”都是正確的,因此方法名checkNonemptycheckNonEmpty也都是正確的。

#p#

編程實(shí)踐

6.1 @Override:能用則用

只要是合法的,就把@Override注解給用上。

6.2 捕獲的異常:不能忽視

除了下面的例子,對(duì)捕獲的異常不做響應(yīng)是極少正確的。(典型的響應(yīng)方式是打印日志,或者如果它被認(rèn)為是不可能的,則把它當(dāng)作一個(gè)AssertionError重新拋出。)

如果它確實(shí)是不需要在catch塊中做任何響應(yīng),需要做注釋加以說明(如下面的例子)。

try {
  int i = Integer.parseInt(response);
  return handleNumericResponse(i);
} catch (NumberFormatException ok) {
  // it's not numeric; that's fine, just continue
}
return handleTextResponse(response);

例外:在測(cè)試中,如果一個(gè)捕獲的異常被命名為expected,則它可以被不加注釋地忽略。下面是一種非常常見的情形,用以確保所測(cè)試的方法會(huì)拋出一個(gè)期望中的異常, 因此在這里就沒有必要加注釋。

try {
  emptyStack.pop();
  fail();
} catch (NoSuchElementException expected) {
}

6.3 靜態(tài)成員:使用類進(jìn)行調(diào)用

使用類名調(diào)用靜態(tài)的類成員,而不是具體某個(gè)對(duì)象或表達(dá)式。

Foo aFoo = ...;
Foo.aStaticMethod(); // good
aFoo.aStaticMethod(); // bad
somethingThatYieldsAFoo().aStaticMethod(); // very bad

6.4 Finalizers: 禁用

極少會(huì)去重載Object.finalize

Tip:不要使用finalize。如果你非要使用它,請(qǐng)先仔細(xì)閱讀和理解Effective Java 第7條款:“Avoid Finalizers”,然后不要使用它。

Javadoc

7.1 格式

7.1.1 一般形式

Javadoc塊的基本格式如下所示:

/**
* Multiple lines of Javadoc text are written here,
* wrapped normally...
*/
public int method(String p1) { ... }

或者是以下單行形式:

/** An especially short bit of Javadoc. */

基本格式總是OK的。當(dāng)整個(gè)Javadoc塊能容納于一行時(shí)(且沒有Javadoc標(biāo)記@XXX),可以使用單行形式。

7.1.2 段落

空行(即,只包含最左側(cè)星號(hào)的行)會(huì)出現(xiàn)在段落之間和Javadoc標(biāo)記(@XXX)之前(如果有的話)。 除了***個(gè)段落,每個(gè)段落***個(gè)單詞前都有標(biāo)簽<p>,并且它和***個(gè)單詞間沒有空格。

7.1.3 Javadoc標(biāo)記

標(biāo)準(zhǔn)的Javadoc標(biāo)記按以下順序出現(xiàn):@param, @return, @throws, @deprecated, 前面這4種標(biāo)記如果出現(xiàn),描述都不能為空。 當(dāng)描述無法在一行中容納,連續(xù)行需要至少再縮進(jìn)4個(gè)空格。

7.2 摘要片段

每個(gè)類或成員的Javadoc以一個(gè)簡(jiǎn)短的摘要片段開始。這個(gè)片段是非常重要的,在某些情況下,它是唯一出現(xiàn)的文本,比如在類和方法索引中。

這只是一個(gè)小片段,可以是一個(gè)名詞短語或動(dòng)詞短語,但不是一個(gè)完整的句子。它不會(huì)以A {@code Foo} is a...This method returns...開頭, 它也不會(huì)是一個(gè)完整的祈使句,如Save the record...。然而,由于開頭大寫及被加了標(biāo)點(diǎn),它看起來就像是個(gè)完整的句子。

Tip:一個(gè)常見的錯(cuò)誤是把簡(jiǎn)單的Javadoc寫成/** @return the customer ID */,這是不正確的。它應(yīng)該寫成/** Returns the customer ID. */

7.3 哪里需要使用Javadoc

至少在每個(gè)public類及它的每個(gè)public和protected成員處使用Javadoc,以下是一些例外:

7.3.1 例外:不言自明的方法

對(duì)于簡(jiǎn)單明顯的方法如getFoo,Javadoc是可選的(即,是可以不寫的)。這種情況下除了寫“Returns the foo”,確實(shí)也沒有什么值得寫了。

單元測(cè)試類中的測(cè)試方法可能是不言自明的最常見例子了,我們通常可以從這些方法的描述性命名中知道它是干什么的,因此不需要額外的文檔說明。

Tip:如果有一些相關(guān)信息是需要讀者了解的,那么以上的例外不應(yīng)作為忽視這些信息的理由。例如,對(duì)于方法名getCanonicalName, 就不應(yīng)該忽視文檔說明,因?yàn)樽x者很可能不知道詞語canonical name指的是什么。

7.3.2 例外:重載

如果一個(gè)方法重載了超類中的方法,那么Javadoc并非必需的。

7.3.3 可選的Javadoc

對(duì)于包外不可見的類和方法,如有需要,也是要使用Javadoc的。如果一個(gè)注釋是用來定義一個(gè)類,方法,字段的整體目的或行為, 那么這個(gè)注釋應(yīng)該寫成Javadoc,這樣更統(tǒng)一更友好。

責(zé)任編輯:王雪燕 來源: Hawstein
相關(guān)推薦

2017-02-13 13:14:07

2017-01-12 14:55:50

JavaScript編程

2021-05-06 11:04:55

GooglePython代碼

2020-07-17 19:36:26

Python編程代碼

2012-03-22 17:16:24

Java

2013-07-10 11:32:57

編碼風(fēng)格

2013-05-20 16:42:13

GoogleGoogle Maps

2022-12-05 09:32:29

Go 語言風(fēng)格規(guī)范

2023-12-04 09:00:00

PythonRuff

2011-10-24 17:12:01

Cloud SQL

2024-10-08 05:00:00

PEP 8編碼Python

2013-05-21 11:22:15

Google+UI設(shè)計(jì)

2023-08-14 14:04:14

JavaScript函數(shù)式編程

2010-11-17 11:31:22

Scala基礎(chǔ)面向?qū)ο?/a>Scala

2024-05-21 09:55:43

AspectOrientedAOP

2013-04-11 10:26:37

Google Glas谷歌眼鏡指南分析

2011-10-27 11:32:36

Google云計(jì)算SQL數(shù)據(jù)庫

2011-12-12 11:16:02

iOS并發(fā)編程

2011-07-03 10:16:45

Core Animat

2010-07-20 13:32:25

Perl編程格式
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

欧美日韩aaaaa| 国产精品久久久久一区二区三区共| 欧美黄色www| 欧美熟妇精品黑人巨大一二三区| 超薄肉色丝袜脚交一区二区| 中文字幕五月欧美| 操一操视频一区| 免费看一级视频| 999国产精品视频| 亚洲国产精品久久精品怡红院| 国产视频一区二区三区在线播放| 超碰在线免费公开| 久久综合久久鬼色中文字| 国产一区二区色| 国产精品100| 亚洲美女视频| 亚洲视屏在线播放| 成年人性生活视频| 欧美xnxx| 欧美日韩激情小视频| 亚洲精品一区二区毛豆| 日本xxxx人| 狠狠色狠狠色综合系列| 欧美中文字幕第一页| 清纯粉嫩极品夜夜嗨av| 成人aaaa| 亚洲精品在线91| 国产a级片视频| 亚洲福利影视| 色噜噜狠狠成人网p站| 日韩精品视频在线观看视频| 欧美一区二区三区| 久久久久国产精品麻豆ai换脸 | 成人看片网站| 欧美日韩激情网| 免费av手机在线观看| 亚洲自拍偷拍福利| 久久精品视频6| 香蕉国产精品| 中文字幕日韩高清| 中国毛片在线观看| 理论片一区二区在线| 制服丝袜在线91| 天天干天天操天天玩| 女生影院久久| 一道本成人在线| 91国视频在线| 国产高潮在线| 亚洲国产成人va在线观看天堂| 91xxx视频| 麻豆视频在线观看免费| 国产精品视频第一区| 色综合久久av| 77导航福利在线| 国产日韩av一区二区| 欧美日韩喷水| 国产免费a∨片在线观看不卡| 久久精品亚洲精品国产欧美kt∨| 任我爽在线视频精品一| 中文字幕黄色大片| 日本在线天堂| 成人欧美一区二区三区黑人麻豆| 亚洲精品视频一二三| 色网站免费在线观看| 国产精品国模大尺度视频| 亚洲国产一区二区三区在线| 1769视频在线播放免费观看| 国产精品久久久久aaaa| 午夜啪啪免费视频| 91高清在线观看视频| 一级精品视频在线观看宜春院| www.69av| caoporn视频在线观看| 韩曰欧美视频免费观看| 北条麻妃在线一区| 日韩欧美一区二区三区免费观看| 精品视频一区三区九区| 中文字幕一区二区在线观看视频| 日韩视频1区| 亚洲国产精品成人av| 国产黄色网址在线观看| 成人亚洲一区| 欧美大片va欧美在线播放| 久久9999久久免费精品国产| 亚洲欧美日韩一区在线观看| 国产精品人人做人人爽| 99草在线视频| 97se狠狠狠综合亚洲狠狠| 日韩中文字幕av在线| 黄色网在线播放| 婷婷成人综合网| 欧美成年人视频在线观看| 天堂精品久久久久| 精品小视频在线| av资源在线免费观看| 国内精品久久久久久久97牛牛| 欧美亚洲伦理www| 一级片一区二区三区| 不卡一卡二卡三乱码免费网站| 日韩精品一区二区三区色偷偷| 91麻豆一二三四在线| 欧美午夜片欧美片在线观看| 亚洲午夜精品一区| 欧美网色网址| 久久天堂电影网| 麻豆成人免费视频| 国产一区二区三区久久悠悠色av| 精品欧美日韩| 国产在线观看a| 色综合久久综合| 日韩成人av影院| 四虎成人精品永久免费av九九| 久久人人爽人人爽人人片av高请 | 91精品在线麻豆| 熟女丰满老熟女熟妇| 欧美1区2区3区| 国产精品免费观看在线| 五月婷婷综合久久| 亚洲色图欧洲色图婷婷| 男女视频一区二区三区| 国产一区二区三区亚洲| 久热国产精品视频| 久久这里只有精品9| 99在线视频精品| 9色视频在线观看| 欧美国产视频| 亚洲美女在线观看| 日本一区二区不卡在线| 国产精品一二三区| 爱爱爱视频网站| 欧美一区二区三区婷婷| 一区三区二区视频| 天堂а√在线中文在线新版| 福利一区福利二区| 久久av喷吹av高潮av| 欧美久久久网站| 国产一区二区三区欧美| 亚洲天堂一区在线| 99久久国产综合精品麻豆| 福利在线一区二区| 亚洲久久久久久久| 欧美激情理论| 国产精品热视频| 黄色片免费在线| 欧美性xxxx极品hd满灌| 亚洲国产欧美视频| 国产欧美另类| 欧美日本国产精品| www.成人影院| 亚洲欧美三级伦理| 免费精品一区二区| 国产亚洲精品aa午夜观看| 欧美日韩大尺度| 国产影视一区| 国产精品丝袜白浆摸在线| 黄色在线网站| 欧美亚洲免费在线一区| 一级黄色毛毛片| 喷水一区二区三区| 在线不卡日本| 欧美高清hd| 久久久免费观看| 五月婷中文字幕| 日韩欧美在线播放| 亚洲午夜精品久久久久久高潮| 石原莉奈在线亚洲三区| 亚洲狠狠婷婷综合久久久| 亚洲成人高清| 欧美激情视频播放| 亚州男人的天堂| 欧美性猛交一区二区三区精品| 一二三四国产精品| 国产成人亚洲精品狼色在线| 国产不卡一区二区视频| 在线亚洲a色| 国产日韩欧美日韩| 手机在线免费观看av| 亚洲精品久久久久中文字幕欢迎你 | 国产精品久久久久久久久久白浆 | 好色先生视频污| 伊人久久影院| 国产99久久精品一区二区永久免费 | 久久不卡日韩美女| 久久69精品久久久久久久电影好| 人妻少妇一区二区三区| 色综合久久久久网| 97在线观看免费高| av中文字幕一区| 亚洲免费看av| 国产综合欧美| 日韩av免费电影| 视频免费一区二区| 国产成人精品一区二区| 成人av免费| 国产亚洲激情在线| 亚洲国产成人精品一区二区三区| 疯狂做受xxxx欧美肥白少妇| 欧美一区免费观看| www成人在线观看| 免费看的av网站| 日欧美一区二区| 亚洲理论电影在线观看| 成人在线免费小视频| 国产精品久久久久久久免费大片 | 免费毛片视频网站| 国产激情一区二区三区四区 | 精品在线免费视频| 18禁网站免费无遮挡无码中文| 欧美猛男做受videos| 国产精品日韩一区二区| 狂野欧美性猛交xxxx| 97av视频在线| 欧美wwww| 久久国产精品久久久| 成人午夜电影在线观看| 亚洲成人网av| 国产高清精品软件丝瓜软件| 欧美视频精品在线| 日本中文字幕第一页| 一区二区三区不卡视频在线观看 | 亚洲91精品| 日本成人看片网址| 国产一区二区三区亚洲| 成人avav影音| 欧美成人r级一区二区三区| 国产三级短视频| 91视频在线看| 任你躁av一区二区三区| 国产尤物一区二区在线| 一区二区三区免费播放| 久久久国产精品一区二区中文| 欧美国产综合在线| 欧美精品三区| 麻豆一区二区三区在线观看| 99精品美女| 亚洲日本精品国产第一区| 教室别恋欧美无删减版| 欧美精品一区三区在线观看| 欧美韩一区二区| 极品尤物一区二区三区| 国产一区丝袜| 精品产品国产在线不卡| 麻豆一区二区| 精品视频一区在线| 香蕉久久夜色精品国产更新时间| 国产一区二区不卡视频| 97人人澡人人爽91综合色| 成人一区二区在线| 99香蕉久久| 好吊色欧美一区二区三区| 国产精品调教| 九色91在线视频| 色狠狠久久av综合| 欧美日韩一区在线观看视频| 国产精品探花在线观看| 午夜精品视频在线观看一区二区| 欧美限制电影| 日韩人妻精品一区二区三区| 91精品推荐| 大陆av在线播放| 一区二区三区成人精品| 国产日韩一区二区在线观看| 久久综合五月| 爱爱爱爱免费视频| 国产在线看一区| 欧美做受高潮中文字幕| 99国产精品视频免费观看| 国产精品久久久久无码av色戒| 久久久久99精品一区| 一级黄色录像毛片| 亚洲欧美福利一区二区| 五月天综合在线| 色老汉av一区二区三区| 一本大道伊人av久久综合| 欧美一级搡bbbb搡bbbb| 欧美 日韩 国产 成人 在线| 亚洲加勒比久久88色综合| 国产精品一区二区婷婷| 久久婷婷国产麻豆91天堂| a级片在线免费| 国产成人亚洲综合91| japansex久久高清精品| 精品国产福利| 日韩三级在线| 欧美亚洲黄色片| 日本va欧美va精品发布| 女人扒开双腿让男人捅 | 成人在线精品视频| 视频精品一区| 日韩免费毛片| 狠狠干综合网| 中文字幕在线观看第三页| 国产精品亚洲一区二区三区在线| 在线观看国产网站| 中文字幕一区二区三区精华液| 精品成人免费视频| 这里只有精品视频在线观看| 天堂av2024| 久久精品中文字幕免费mv| 日韩影院在线| 91夜夜未满十八勿入爽爽影院| 首页亚洲中字| 精品久久久无码人妻字幂| 日韩不卡一区二区三区| 女性生殖扒开酷刑vk| 国产精品视频一二三| 日韩三级视频在线播放| 日韩亚洲欧美在线观看| www.av在线| 国产91精品久| 日本一区二区乱| 亚洲欧洲另类精品久久综合| 国产精品久久久久9999高清| 久久久久亚洲av片无码v| 国产女人18毛片水真多成人如厕| 黄色小说在线观看视频| 欧美日韩夫妻久久| 第三区美女视频在线| 午夜精品视频在线| 色妞ww精品视频7777| 一区二区冒白浆视频| 日韩专区中文字幕一区二区| 无码国产69精品久久久久网站 | 狠狠久久综合| 欧美精品免费观看二区| 伊人久久亚洲影院| 亚洲午夜精品在线观看| 1区2区3区国产精品| 中国女人一级一次看片| 亚洲三级 欧美三级| 男人久久天堂| 精品91免费| 亚洲一区二区网站| 黄色污在线观看| 精品久久久免费| 五月激情丁香婷婷| 性色av香蕉一区二区| 国内精品麻豆美女在线播放视频 | 欧美裸体网站| 亚洲免费综合| 一出一进一爽一粗一大视频| 亚洲成人av福利| 人妻妺妺窝人体色www聚色窝| 欧美激情一区二区久久久| 亚洲大奶少妇| a级免费在线观看| av亚洲精华国产精华精| 日本熟妇毛茸茸丰满| 亚洲成av人影院在线观看| a在线视频v视频| 欧美精品123| 日日摸夜夜添夜夜添亚洲女人| 午夜时刻免费入口| 欧美偷拍一区二区| 四虎久久免费| 51国产成人精品午夜福中文下载| 伊人久久大香线| 在线播放第一页| 午夜精品123| 日本1级在线| 国产久一一精品| 中文乱码免费一区二区三区下载| 天天爽夜夜爽视频| 亚洲国产精品综合小说图片区| 婷婷在线观看视频| 4k岛国日韩精品**专区| 精品国产aⅴ| 亚洲午夜精品一区| 亚洲图片有声小说| 神马亚洲视频| 国产精品亚洲综合天堂夜夜| 亚洲视频电影在线| 日韩精品视频一区二区| 日韩欧美在线免费观看| 五月香视频在线观看| 3d动漫啪啪精品一区二区免费| 亚洲精品婷婷| 日本美女bbw| 欧美成人在线直播| 伊人久久视频| 一区二区在线观看网站| 成人午夜视频福利| 加勒比在线一区| 欧美成人午夜激情在线| 在线日韩一区| 韩国一区二区三区四区| 欧美午夜片欧美片在线观看| 浪潮av一区| 欧美日本韩国一区二区三区| 九九久久精品视频| 久久夜色精品亚洲| 日韩在线免费观看视频| 狠狠久久伊人| 国产精品区在线| 欧美日韩一区二区精品| 中文字幕有码在线观看| 日本精品一区二区三区高清 久久 日本精品一区二区三区不卡无字幕 | 国产亚洲第一页| 在线播放国产一区中文字幕剧情欧美| 2021年精品国产福利在线|