Google 的 Java 编码规范,参考学习!
這份文檔是 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)制要求的,我們盡量避免提供意見。
?
01 術(shù)語(yǔ)說明和指南說明
在本文檔中,除非另有說明:
1、術(shù)語(yǔ)class可表示一個(gè)普通類,枚舉類,接口或是annotation類型( @interface) 2、術(shù)語(yǔ)comment只用來指代實(shí)現(xiàn)的注釋(implementation comments),我們不使用“documentation comments”一詞,而是用Javadoc。其他的術(shù)語(yǔ)說明會(huì)偶爾在后面的文檔出現(xiàn)。
本文檔中的示例代碼并不作為規(guī)范。也就是說,雖然示例代碼是遵循 Google 編程風(fēng)格,但并不意味著這是展現(xiàn)這些代碼的唯一方式。示例中的格式選擇不應(yīng)該被強(qiáng)制定為規(guī)則。
?
02 源文件基礎(chǔ)
2.1 文件名
源文件以其最頂層的類名來命名,大小寫敏感,文件擴(kuò)展名為 .java。
2.2 文件編碼:UTF-8
源文件編碼格式為UTF-8。
2.3 特殊字符
2.3.1 空白字符
除了行結(jié)束符序列,ASCII水平空格字符(0x20,即空格)是源文件中唯一允許出現(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)制(比如 \012)或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字符,如果真的有需要的話)
?
03 源文件結(jié)構(gòu)
一個(gè)源文件包含(按順序地):
1、許可證或版權(quán)信息(如有需要)?
2、package 語(yǔ)句?
3、import 語(yǔ)句?
4、一個(gè)頂級(jí)類(只有一個(gè))
以上每個(gè)部分之間用一個(gè)空行隔開。
3.1 許可證或版權(quán)信息
如果一個(gè)文件包含許可證或版權(quán)信息,那么它應(yīng)當(dāng)被放在文件最前面。
3.2 package語(yǔ)句
package 語(yǔ)句不換行,列限制(4.4節(jié))并不適用于 package 語(yǔ)句。(即package 語(yǔ)句寫在一行里)
3.3 import語(yǔ)句
3.3.1 import不要使用通配符
即,不要出現(xiàn)類似這樣的import語(yǔ)句:importjava.util.*;
3.3.2 不要換行
import語(yǔ)句不換行,列限制(4.4節(jié))并不適用于 import 語(yǔ)句。(每個(gè) import 語(yǔ)句獨(dú)立成行)
3.3.3 順序和間距
import 語(yǔ)句可分為以下幾組,按照這個(gè)順序,每組由一個(gè)空行分隔:
1、所有的靜態(tài)導(dǎo)入獨(dú)立成組?
2、 com.google imports(僅當(dāng)這個(gè)源文件是在 com.google 包下)?
3、第三方的包。每個(gè)頂級(jí)包為一組,字典序。例如:android, com, junit, org, sun
4、 java imports?
5、 javax imports
組內(nèi)不空行,按字典序排列。
3.4 類聲明
3.4.1 只有一個(gè)頂級(jí)類聲明
每個(gè)頂級(jí)類都在一個(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ù)/方法。
?
04 格式
術(shù)語(yǔ)說明:塊狀結(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ǔ)句一起使用,即使只有一條語(yǔ)句(或是空),也應(yīng)該把大括號(hào)寫上。
4.1.2 非空塊:K & R 風(fēng)格
對(duì)于非空塊和塊狀結(jié)構(gòu),大括號(hào)遵循Kernighan和Ritchie風(fēng)格 (Egyptian brackets):
1、左大括號(hào)前不換行?
2、左大括號(hào)后換行?
3、右大括號(hào)前換行?
4、如果右大括號(hào)是一個(gè)語(yǔ)句、函數(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è)多塊語(yǔ)句的一部分(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è)語(yǔ)句
每個(gè)語(yǔ)句后要換行。
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、 package和 import語(yǔ)句(見3.2節(jié)和3.3節(jié))。
3、注釋中那些可能被剪切并粘貼到shell中的命令行。
4.5 自動(dòng)換行
術(shù)語(yǔ)說明:一般情況下,一行長(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)則是:更傾向于在更高的語(yǔ)法級(jí)別處斷開。
1、如果在 非賦值運(yùn)算符處斷開,那么在該符號(hào)前斷開(比如+,它將位于下一行)。注意:這一點(diǎn)與Google其它語(yǔ)言的編程風(fēng)格不同(如C++和JavaScript)。這條規(guī)則也適用于以下“類運(yùn)算符”符號(hào):點(diǎn)分隔符(.),類型界限中的&( <TextendsFoo&Bar>),catch塊中的管道符號(hào)( catch(FooException|BarExceptione)
2、如果在 賦值運(yùn)算符處斷開,通常的做法是在該符號(hào)后斷開(比如=,它與前面的內(nèi)容留在同一行)。這條規(guī)則也適用于 foreach語(yǔ)句中的分號(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è)空格(語(yǔ)法元素存在多級(jí)時(shí))。一般而言,兩個(gè)連續(xù)行使用相同的縮進(jìn)當(dāng)且僅當(dāng)它們開始于同級(jí)語(yǔ)法元素。
第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),語(yǔ)句的邏輯分組間使用空行。
3、類內(nèi)的第一個(gè)成員前或最后一個(gè)成員后的空行是可選的(既不鼓勵(lì)也不反對(duì)這樣做,視個(gè)人喜好而定)。
4、要滿足本文檔中其他節(jié)的空行要求(比如3.3節(jié):import語(yǔ)句)
多個(gè)連續(xù)的空行是允許的,但沒有必要這樣做(我們也不鼓勵(lì)這樣做)。
4.6.2 水平空白
除了語(yǔ)言需求和其它規(guī)則,并且除了文字,注釋和Javadoc用到單個(gè)空格,單個(gè)ASCII空格也出現(xiàn)在以下幾個(gè)地方:
1、分隔任何保留字與緊隨其后的左括號(hào)( ()(如 if,forcatch等)。
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):
類型界限中的&( <TextendsFoo&Bar>)。catch塊中的管道符號(hào)( catch(FooException|BarExceptione)。foreach語(yǔ)句中的分號(hào)。
5、在 ,:;及右括號(hào)( ))后
6、如果在一條語(yǔ)句后做注釋,則雙斜杠(//)兩邊都要空格。這里可以允許多個(gè)空格,但沒有必要。
7、類型和變量之間:List<string>list。</string>
8、數(shù)組初始化中,大括號(hào)內(nèi)的空格是可選的,即 newint[]{5,6}和 newint[]{5,6}都是可以的。
Note:這個(gè)規(guī)則并不要求或禁止一行的開關(guān)或結(jié)尾需要額外的空格,只對(duì)內(nèi)部空格做要求。
4.6.3 水平對(duì)齊:不做要求
術(shù)語(yǔ)說明:水平對(duì)齊指的是通過增加可變數(shù)量的空格來使某一行的字符與上一行的相應(yīng)字符對(duì)齊。
這是允許的(而且在不少地方可以看到這樣的代碼),但Google編程風(fēng)格對(duì)此不做要求。即使對(duì)于已經(jīng)使用水平對(duì)齊的代碼,我們也不需要去保持這種風(fēng)格。
以下示例先展示未對(duì)齊的代碼,然后是對(duì)齊的代碼:
private int x; // this is fineprivate Color color; // this tooprivate int x; // permitted, but future editsprivate 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 }4.8.2.1 每次只聲明一個(gè)變量
不要使用組合聲明,比如 inta,b;。
4.8.2.2 需要時(shí)才聲明,并盡快進(jìn)行初始化
不要在一個(gè)代碼塊的開頭把局部變量一次性都聲明了(這是 c 語(yǔ)言的做法),而是在第一次需要使用它時(shí)才聲明。局部變量在聲明時(shí)最好就進(jìn)行初始化,或者聲明后盡快進(jìn)行初始化。
4.8.3 數(shù)組
4.8.3.1 數(shù)組初始化:可寫成塊狀結(jié)構(gòu)
數(shù)組初始化可以寫成塊狀結(jié)構(gòu),比如,下面的寫法都是 OK 的:
?
4.8.3.2 非C風(fēng)格的數(shù)組聲明
???????中括號(hào)是類型的一部分:String[]args, 而非 Stringargs[]。
4.8.4 switch 語(yǔ)句
術(shù)語(yǔ)說明:switch塊的大括號(hào)內(nèi)是一個(gè)或多個(gè)語(yǔ)句組。每個(gè)語(yǔ)句組包含一個(gè)或多個(gè)switch標(biāo)簽( caseFOO:或 default:),后面跟著一條或多條語(yǔ)句。switch case 支持的 6 種數(shù)據(jù)類型,推薦大家看下。
4.8.4.1 縮進(jìn)
與其它塊狀結(jié)構(gòu)一致,switch 塊中的內(nèi)容縮進(jìn)為 2 個(gè)空格。
每個(gè) switch 標(biāo)簽后新起一行,再縮進(jìn)2個(gè)空格,寫下一條或多條語(yǔ)句。
4.8.4.2 Fall-through:注釋
在一個(gè) switch 塊內(nèi),每個(gè)語(yǔ)句組要么通過 break,continue,return 或拋出異常來終止,要么通過一條注釋來說明程序?qū)⒗^續(xù)執(zhí)行到下一個(gè)語(yǔ)句組, 任何能表達(dá)這個(gè)意思的注釋都是OK的(典型的是用 // fall through)。這個(gè)特殊的注釋并不需要在最后一個(gè)語(yǔ)句組(一般是 default)中出現(xiàn)。示例:
?
4.8.4.3 default 的情況要寫出來
每個(gè) switch 語(yǔ)句都包含一個(gè) default 語(yǔ)句組,即使它什么代碼也不包含。
4.8.5 注解(Annotations)
注解緊跟在文檔塊后面,應(yīng)用于類、方法和構(gòu)造函數(shù),一個(gè)注解獨(dú)占一行。這些換行不屬于自動(dòng)換行(第4.5節(jié),自動(dòng)換行),因此縮進(jìn)級(jí)別不變。例如:
@Override@Nullablepublic String getNameIfPresent() { ... }
例外:單個(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ì)齊。?
/** 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 語(yǔ)言規(guī)范中推薦的順序出現(xiàn)。
public protected private abstract static final transient volatile synchronized native strictfp05 命名約定
5.1 對(duì)所有標(biāo)識(shí)符都通用的規(guī)則
標(biāo)識(shí)符只能使用 ASCII 字母和數(shù)字,因此每個(gè)有效的標(biāo)識(shí)符名稱都能匹配正則表達(dá)式 \w+。
在 Google 其它編程語(yǔ)言風(fēng)格中使用的特殊前綴或后綴,如 name_, mName, s_name 和 kName,在 Java 編程風(fēng)格中都不再使用。
5.2 標(biāo)識(shí)符類型的規(guī)則
5.2.1 包名
包名全部小寫,連續(xù)的單詞只是簡(jiǎn)單地連接起來,不使用下劃線。
5.2.2 類名
類名都以 UpperCamelCase 風(fēng)格編寫。
類名通常是名詞或名詞短語(yǔ),接口名稱有時(shí)可能是形容詞或形容詞短語(yǔ)。現(xiàn)在還沒有特定的規(guī)則或行之有效的約定來命名注解類型。
測(cè)試類的命名以它要測(cè)試的類的名稱開始,以 Test 結(jié)束。例如,?HashTest 或 HashIntegrationTest。
5.2.3 方法名
方法名都以 lowerCamelCase 風(fēng)格編寫。
方法名通常是動(dòng)詞或動(dòng)詞短語(yǔ)。
下劃線可能出現(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ì)象一般是不夠的,它要真的一直不變才能將它示為常量。
// Constantsstatic final int NUMBER = 5;static final ImmutableList<String> NAMES = ImmutableList.of("Ed", "Ann");static final Joiner COMMA_JOINER = Joiner.on(','); // because Joiner is immutablestatic final SomeMutableType[] EMPTY_ARRAY = {};enum SomeEnum { ENUM_CONSTANT }// Not constantsstatic 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"};這些名字通常是名詞或名詞短語(yǔ)。
5.2.5 非常量字段名
非常量字段名以 lowerCamelCase 風(fēng)格編寫。
這些名字通常是名詞或名詞短語(yǔ)。
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)行命名:
1、單個(gè)的大寫字母,后面可以跟一個(gè)數(shù)字(如:E, T, X, T2)。2、以類命名方式(5.2.2節(jié)),后面加個(gè)大寫的T(如:RequestT, FooBarT)。
5.3 駝峰式命名法(CamelCase)
駝峰式命名法分大駝峰式命名法(UpperCamelCase)和小駝峰式命名法( lowerCamelCase)。有時(shí),我們有不只一種合理的方式將一個(gè)英語(yǔ)詞組轉(zhuǎn)換成駝峰形式,如縮略語(yǔ)或不尋常的結(jié)構(gòu)(例如”IPv6”或”iOS”)。Google 指定了以下的轉(zhuǎn)換方案。
名字從散文形式(prose form)開始:
1、把短語(yǔ)轉(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í)符。
示例:
?
加星號(hào)處表示可以,但不推薦。
Note:在英語(yǔ)中,某些帶有連字符的單詞形式不唯一。例如:”nonempty”和”non-empty”都是正確的,因此方法名 checkNonempty和 checkNonEmpty也都是正確的。
?
06 編程實(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è)期望中的異常, 因此在這里就沒有必要加注釋。
?
6.3 靜態(tài)成員:使用類進(jìn)行調(diào)用
使用類名調(diào)用靜態(tài)的類成員,而不是具體某個(gè)對(duì)象或表達(dá)式。
?
6.4 Finalizers:禁用
極少會(huì)去重寫 Object.finalize。
Tip:不要使用 finalize。如果你非要使用它,請(qǐng)先仔細(xì)閱讀和理解 Effective Java 第7條款:“Avoid Finalizers”,然后不要使用它。
07 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è)名詞短語(yǔ)或動(dòng)詞短語(yǔ),但不是一個(gè)完整的句子。它不會(huì)以 A{@codeFoo}isa...或 Thismethod returns...開頭, 它也不會(huì)是一個(gè)完整的祈使句,如 Savethe 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者很可能不知道詞語(yǔ) canonical name 指的是什么。
7.3.2 例外:重寫
如果一個(gè)方法重寫了超類中的方法,那么 Javadoc 并非必需的。
7.3.3 可選的 Javadoc
對(duì)于包外不可見的類和方法,如有需要,也是要使用 Javadoc 的。如果一個(gè)注釋是用來定義一個(gè)類,方法,字段的整體目的或行為, 那么這個(gè)注釋應(yīng)該寫成 Javadoc,這樣更統(tǒng)一更友好。
?
原文:google.github.io/styleguide/javaguide.html
譯者:Hawstein
來源:hawstein.com/2014/01/20/google-java-style/
轉(zhuǎn)載于:https://www.cnblogs.com/admans/p/11168538.html
總結(jié)
以上是生活随笔為你收集整理的Google 的 Java 编码规范,参考学习!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Appium进行iOS自动化测试时遇到的
- 下一篇: Java 中的字符串(String)与C