[軟件構(gòu)造] Google Java 代碼規(guī)范 中英文版本

英文版本

https://google.github.io/styleguide/javaguide.html


中文版本

轉(zhuǎn)自CSDN https://blog.csdn.net/lawliet3389/article/details/54341337

引言

本文為Google java編程語(yǔ)言編碼規(guī)范的完整定義窗宇。依照此規(guī)范編寫的Java源碼文件可以被稱為Google Style饲鄙。

和其他編程規(guī)范指南一樣沼瘫,規(guī)范不僅包括代碼的結(jié)構(gòu)美學(xué),也包括了其他一些業(yè)界約定俗成的公約和普遍采用的標(biāo)準(zhǔn)糊肤。本文檔中的規(guī)范基本都是業(yè)界已經(jīng)達(dá)成共識(shí)的標(biāo)準(zhǔn)遮精,我們盡量避免去定義那些還存在爭(zhēng)議的地方。

1.1 術(shù)語(yǔ)說明

在本文中(除非另有說明):

  1. 類(Class):用于標(biāo)識(shí)是一個(gè)普通類(Class)祟牲、枚舉類(enum)、接口(interface)或注解類型(@interface)抖部。
  2. 成員(member of a class):表示嵌套類、屬性议惰、方法或構(gòu)造方法慎颗;即除了初始化和注釋之外的類的所有頂級(jí)內(nèi)容。
  3. 注釋 (comment )總是指implementation comments(實(shí)現(xiàn)注釋)言询。我們不使用“文檔注釋”這樣的說法俯萎,而會(huì)直接說“Javadoc”。

其它術(shù)語(yǔ)將在文檔中單獨(dú)說明运杭。

1.2 指南說明

本文檔中的代碼并不一定符合所有規(guī)范夫啊。即使這些代碼遵循Google Style,但這不是唯一的代碼規(guī)范辆憔。例子中可選的格式風(fēng)格也不應(yīng)該作為強(qiáng)制執(zhí)行的規(guī)范撇眯。

2源碼文件基礎(chǔ)

2.1 文件名

源碼文件名由它所包含的頂級(jí)class的類名(區(qū)分大小寫),加上.java擴(kuò)展名組成虱咧。

2.2 文件編碼:UTF-8

源碼文件編碼應(yīng)為UTF-8熊榛。

2.3 特殊字符

2.3.1 空格字符

除了換行符外,ASCII水平空白字符(0x20)是源碼文件中唯一支持的空格字符腕巡。這意味著:

  1. 字符串和字符文字中的所有其它空格字符都將被轉(zhuǎn)義玄坦。
  2. 制表符(Tab鍵)不用于縮進(jìn)。

2.3.2 特殊轉(zhuǎn)義字符串

任何需要轉(zhuǎn)義字符串表示的字符(例如\b, \t, \n, \f, \r, \’, \等)绘沉,采用這種轉(zhuǎn)義字符串的方式表示煎楣,而不采用對(duì)應(yīng)字符的八進(jìn)制數(shù)(例如 \012)或Unicode碼(例如 \u000a)表示。

2.3.3 非ASCII字符

對(duì)于其余非ASCII字符车伞,直接使用Unicode字符(例如 ∞)择懂,或者使用對(duì)應(yīng)的Unicode碼(例如 \u221e)轉(zhuǎn)義,都是允許的帖世。唯一需要考慮的是休蟹,何種方式更能使代碼容易閱讀和理解沸枯。

提示:在使用unicode碼轉(zhuǎn)義,或者甚至是有時(shí)直接使用unicode字符的時(shí)候赂弓,添加一點(diǎn)說明注釋將對(duì)別人讀懂代碼很有幫助绑榴。

例子:


這里寫圖片描述

提示:不要因?yàn)閾?dān)心一些程序無法正常處理ASCII字符而不使用它,從而導(dǎo)致代碼易讀性變差盈魁。如果出現(xiàn)這樣的問題翔怎,應(yīng)該由出現(xiàn)問題的程序去解決。

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

源碼文件包括杨耙,依次是:

  1. License或者copyright聲明信息(如有)
  2. 包聲明語(yǔ)句
  3. import語(yǔ)句
  4. class類聲明

每個(gè)部分之間以一行空行分隔赤套。

3.1 Lincense 或 copyright聲明信息(如有)

如果需要聲明lincense或copyright信息,應(yīng)該在文件開始時(shí)聲明珊膜。

3.2 包聲明

包聲明沒有長(zhǎng)度限制容握,單行長(zhǎng)度限制規(guī)范,不適用于包聲明车柠。

3.3 import語(yǔ)句

3.3.1 不使用通配符import

不應(yīng)使用通配符import剔氏,不管是不是靜態(tài)導(dǎo)入。

3.3.2 沒有行長(zhǎng)度限制

import語(yǔ)句的行竹祷,沒有行長(zhǎng)度的限制谈跛。單行長(zhǎng)度限制規(guī)范,不適用于import語(yǔ)句所在行塑陵。

3.3.3 順序和空行

import的順序如下:

  1. 所有靜態(tài)導(dǎo)入(static import)為一組
  2. 所有非靜態(tài)導(dǎo)入為一組

如果同時(shí)存在靜態(tài)導(dǎo)入與非靜態(tài)導(dǎo)入感憾,則以一個(gè)空白行分隔,import語(yǔ)句之間沒有其它空行令花。
每一個(gè)組中阻桅,import的名稱以ASCII排序顯示。

3.3.4 沒有靜態(tài)導(dǎo)入的類

靜態(tài)導(dǎo)入不能用于靜態(tài)嵌套類彭则。它們可以正常導(dǎo)入鳍刷。

3.4 類聲明

3.4.1 只聲明唯一一個(gè)頂級(jí)class

每個(gè)源碼文件中只能有一個(gè)頂級(jí)class。

3.4.2 類成員順序

類成員的順序?qū)Υa的易讀性有很大影響俯抖,但是沒有一個(gè)統(tǒng)一正確的標(biāo)準(zhǔn)输瓜。不同的類可以以不同的方式對(duì)其內(nèi)容進(jìn)行排序。

重要的是芬萍,每個(gè)class都要按照一定的邏輯規(guī)律排序尤揣。當(dāng)被問及時(shí),能夠解釋清楚為什么這樣排序柬祠。例如北戏,新增加的成員方法,不是簡(jiǎn)單地放在class代碼最后面漫蛔,按日期排序不是按邏輯排序嗜愈。

3.4.2.1 重載:從不分開

當(dāng)一個(gè)類有多個(gè)構(gòu)造函數(shù)或多個(gè)同名的方法時(shí)旧蛾,這個(gè)函數(shù)要寫在一些,中間不要有其它代碼蠕嫁。

4锨天、格式規(guī)范

術(shù)語(yǔ)注:塊狀結(jié)構(gòu)(block-like construct)指類、成員函靈敏和構(gòu)造函數(shù)的主體剃毒。需要注意的是病袄,在后面的4.8.3.1節(jié)中講到的數(shù)組初始化,所有的數(shù)組初始化都可以被 認(rèn)為是一個(gè)塊狀結(jié)構(gòu)(非強(qiáng)制)赘阀。

4.1 大括號(hào)

4.1.1 在需要的地方使用

大括號(hào)用在if,else,for,do,和while等語(yǔ)句益缠。甚至當(dāng)它的實(shí)現(xiàn)為空或者只有一句話時(shí),也要使用基公。

4.1.2 非空語(yǔ)句塊采用K&R風(fēng)格

對(duì)于非空語(yǔ)句塊幅慌,大括號(hào)遵循Kernighan和Ritchie的風(fēng)格:

  1. 大括號(hào)前沒有換行
  2. 開頭大括號(hào)后換行
  3. 結(jié)束大括號(hào)前換行
  4. 如果右括號(hào)結(jié)束一個(gè)語(yǔ)句塊或者函數(shù)體、構(gòu)造函數(shù)體或者有命名的類體轰豆,則需要換行欠痴。例如,當(dāng)右括號(hào)后面接else或者逗號(hào)時(shí)秒咨,不應(yīng)該換行。

例子:


這里寫圖片描述

一些例外的情況掌挚,將在4.8.1節(jié)講枚舉類型時(shí)講到雨席。

4.1.3 空語(yǔ)句塊:使代碼更簡(jiǎn)法

一個(gè)空的語(yǔ)句塊,可以在大括號(hào)開始之后真接接結(jié)束大括號(hào)吠式,中間不需要空格或換行陡厘。但是當(dāng)一個(gè)由幾個(gè)語(yǔ)句塊聯(lián)合組成的語(yǔ)句塊時(shí),則需要換行特占。(例如:if/else 或try/catch/finally)

例子:


這里寫圖片描述

反例:


這里寫圖片描述

4.2 語(yǔ)句塊的縮進(jìn):2空格

每當(dāng)一個(gè)新的語(yǔ)句塊產(chǎn)生糙置,縮進(jìn)就增加兩個(gè)空格。當(dāng)這個(gè)語(yǔ)句塊結(jié)束時(shí)是目,縮進(jìn)恢復(fù)到上一層級(jí)的縮進(jìn)格數(shù)谤饭。縮進(jìn)要求對(duì)整個(gè)語(yǔ)句塊中的代碼和注釋都適用懊纳。(例子可參考之前4.1.2節(jié)中的例子)揉抵。

4.3 一行最多只有一句代碼

每句代碼的結(jié)束都需要換行。

4.4 行長(zhǎng)度限制:100

Java代碼的單行限制長(zhǎng)度為100個(gè)字符嗤疯。除以下情況冤今,超出此上限的行必須進(jìn)行換行,如4.5節(jié)所解釋的茂缚。
例外:

  1. 無法遵守的地方(例如:Javadoc中長(zhǎng)的URL或長(zhǎng)JSNI方法的引用)
  2. package和import語(yǔ)句(見3.2節(jié) 包聲明和3.3節(jié) import語(yǔ)句)
  3. 注釋中的命令行指令戏罢,可以剪切并粘貼到shell中的

4.5 長(zhǎng)行換行

術(shù)語(yǔ)說明:當(dāng)一行代碼按照其他規(guī)范都合法屋谭,只是為了避免超出行長(zhǎng)度限制而換行時(shí),稱為長(zhǎng)行換行龟糕。

長(zhǎng)行斷行桐磁,沒有一個(gè)適合所有場(chǎng)景的全面、確定的規(guī)范翩蘸。但很多相同的情況所意,我們經(jīng)常使用一些行之有效的斷行方法。

注:將長(zhǎng)行封裝為函數(shù)催首,或者使用局部變量的方法扶踊,也可以解決一些超出行長(zhǎng)度限制的情況。并非一定要斷行郎任。

提示:提取方法或局部變量可以解決該問題秧耗,而不需要長(zhǎng)行換行。

4.5.1 在何處換行

換行的主要原則是:選擇在更高一級(jí)的語(yǔ)法邏輯的地方斷行舶治。其他一些原則如下:

  1. 當(dāng)一個(gè)非賦值運(yùn)算的語(yǔ)句斷行時(shí)分井,在運(yùn)算符號(hào)之前斷行。(這與Google的C++規(guī)范和JavaScrip規(guī)范等其他規(guī)范不同)霉猛。
    這也適用于以下類似運(yùn)算符的符號(hào):

    • 點(diǎn)分隔符(.)
    • 方法此用中的兩個(gè)冒號(hào)(::)
    • 泛型類的符號(hào)(< T extends Foo & Bar>)
    • catch塊( catch (FooException | BarException e))
  2. 當(dāng)一個(gè)賦值運(yùn)算語(yǔ)句斷行時(shí)尺锚,一般在賦值符號(hào)之后斷行。但是也可以在之前斷行惜浅。

  3. 在調(diào)用函數(shù)或者構(gòu)造函數(shù)需要斷行時(shí)瘫辩,與函數(shù)名相連的左括號(hào)要在一行。也就是在左括號(hào)之后斷行坛悉。

  4. 逗號(hào)斷行時(shí)伐厌,要和逗號(hào)隔開的前面的語(yǔ)句斷行。也就是在逗號(hào)之后斷行裸影。

  5. 在lambda中挣轨,一行不會(huì)與箭頭相鄰,除非如果lambda的主體由單個(gè)無括號(hào)的表達(dá)式組成轩猩,則可以在箭頭之后立即出現(xiàn)換行卷扮。
    例子:


    這里寫圖片描述

注:換行的主要目的是要清晰的代碼,每行不一定適合最小的限制字符界轩。

4.5.2 斷行的縮進(jìn):至少4個(gè)字符

當(dāng)斷行之后画饥,在第一行之后的行,我們叫做延續(xù)行浊猾。每一個(gè)延續(xù)行在第一行的基礎(chǔ)上至少縮進(jìn)四個(gè)字符抖甘。
當(dāng)原行之后有多個(gè)延續(xù)行的情況,縮進(jìn)可以大于4個(gè)字符葫慎。如果多個(gè)延續(xù)行之間由同樣的語(yǔ)法元素?cái)嘈邢纬梗鼈兛梢圆捎孟嗤目s進(jìn)薇宠。

4.6.3節(jié)介紹水平對(duì)齊中,解決了使用多個(gè)空格與之前行縮進(jìn)對(duì)齊的問題艰额。

4.6 空白空間

4.6.1 垂直空白

單行空行在以下情況使用:

  1. 類成員間需要空行隔開:例如成員變量澄港、構(gòu)造函數(shù)、成員函數(shù)柄沮、內(nèi)部類回梧、靜態(tài)初始化語(yǔ)句塊(static initializers)、實(shí)例初始化語(yǔ)句塊(instance initializers)祖搓。
    例外:成員變量之間的空白行不是必需的狱意。一般多個(gè)成員變量中間的空行,是為了對(duì)成員變量做邏輯上的分組拯欧。
  2. 在函數(shù)內(nèi)部详囤,根據(jù)代碼邏輯分組的需要,設(shè)置空白行作為間隔镐作。
  3. 類的第一個(gè)成員之前藏姐,或者最后一個(gè)成員結(jié)束之后,用空行間隔该贾。(可選)
  4. 本文檔中其他部分介紹的需要空行的情況羔杨。(例如 3.3節(jié)中的import語(yǔ)句)

單空行時(shí)使用多行空行是允許的,但是不要求也不鼓勵(lì)杨蛋。

4.6.2 水平空白

除了語(yǔ)法问畅、其他規(guī)則、詞語(yǔ)分隔六荒、注釋和javadoc外,水平的ASCII空格只在以下情況出現(xiàn):

  1. 所有保留的關(guān)鍵字與緊接它之后的位于同一行的左括號(hào)之間需要用空格隔開矾端。(例如if掏击、for、catch)

  2. 所有保留的關(guān)鍵字與在它之前的右花括號(hào)之間需要空格隔開秩铆。(例如else砚亭、catch)

  3. 在左花括號(hào)之前都需要空格隔開。只有兩種例外:

    @SomeAnnotation({a, b})

    String[][] x = {{"foo"}};

  4. 所有的二元運(yùn)算符和三元運(yùn)算符的兩邊殴玛,都需要空格隔開捅膘。

  5. 逗號(hào)、冒號(hào)滚粟、分號(hào)和右括號(hào)之后寻仗,需要空格隔開。

  6. // 雙斜線開始一行注釋時(shí)凡壤。雙斜線兩邊都應(yīng)該用空格隔開署尤。并且可使用多個(gè)空格耙替,但是不做強(qiáng)制要求。

  7. 變量聲明時(shí)曹体,變量類型和變量名之間需要用空格隔開俗扇。

  8. 初始化一個(gè)數(shù)組時(shí),花括號(hào)之間可以用空格隔開箕别,也可以不使用铜幽。(例如:new int[] {5, 6} 和 new int[] { 5, 6 } 都可以)

注意:這一原則不影響一行開始或者結(jié)束時(shí)的空格。只針對(duì)行內(nèi)部字符之間的隔開串稀。

4.6.3 水平對(duì)齊:不做強(qiáng)制要求

術(shù)語(yǔ)說明:水平對(duì)齊除抛,是指通過添加多個(gè)空格,使本行的某一符號(hào)與上一行的某一符號(hào)上下對(duì)齊厨诸。

這種對(duì)齊是被允許的镶殷,但是不會(huì)做強(qiáng)制要求。

以下是沒有水平對(duì)齊和水平對(duì)齊的例子;


這里寫圖片描述

提示:水平對(duì)齊能夠增加代碼的可讀性微酬,但是增加了未來維護(hù)代碼的難度绘趋。考慮到維護(hù)時(shí)只需要改變一行代碼颗管,之前的對(duì)齊可以不需要改動(dòng)陷遮。為了對(duì)齊,你更有可能改 了一行代碼垦江,同時(shí)需要更改附近的好幾行代碼帽馋,而這幾行代碼的改動(dòng),可能又會(huì)引起一些為了保持對(duì)齊的代碼改動(dòng)比吭。那原本這行改動(dòng)绽族,我們稱之為“爆炸半徑”。這 種改動(dòng)衩藤,在最壞的情況下可能會(huì)導(dǎo)致大量的無意義的工作吧慢,即使在最好的情況下,也會(huì)影響版本歷史信息赏表,減慢代碼review的速度检诗,引起更多merge代碼 沖突的情況。

4.7 分組括號(hào):建議使用

非必須的分組括號(hào)只有在編寫代碼者和代碼審核者都認(rèn)為大家不會(huì)因?yàn)闆]有它而導(dǎo)致代碼理解錯(cuò)誤的時(shí)候瓢剿,或者它不會(huì)使代碼更易理解的時(shí)候才能省略逢慌。沒有理由認(rèn)為所有閱讀代碼的人都能記住所有java運(yùn)算符的優(yōu)先級(jí)。

4.8 特殊結(jié)構(gòu)

4.8.1 枚舉類型

在遵循枚舉常量的每個(gè)逗號(hào)后间狂,換行符是可選的攻泼,還允許附加空行(通常只有一個(gè))。如下例子:


這里寫圖片描述

就像是數(shù)組的初始化(詳見4.8.3.1節(jié))


這里寫圖片描述

枚舉類型也是一種類(Class),因此Class類的其他格式要求坠韩,也適用于枚舉類型距潘。

4.8.2 變量聲明

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

不要采用一個(gè)聲明,聲明多個(gè)變量只搁。例如 int a, b;

4.8.2.2 當(dāng)需要時(shí)才聲明音比,盡快完成初始化

局部變量不應(yīng)該習(xí)慣性地放在語(yǔ)句塊的開始處聲明,而應(yīng)該盡量離它第一次使用的地方最近的地方聲明氢惋,以減小它們的使用范圍洞翩。
局部變量應(yīng)該在聲明的時(shí)候就進(jìn)行初始化。如果不能在聲明時(shí)初始化焰望,也應(yīng)該盡快完成初始化骚亿。

4.8.3 數(shù)組

4.8.3.1 數(shù)組初始化:可以類似塊代碼處理

所有數(shù)組的初始化,都可以采用和塊代碼相同的格式處理熊赖。例如以下格式都是允許的:


這里寫圖片描述
4.8.3.2 不能像C風(fēng)格一樣聲明數(shù)組

方括號(hào)應(yīng)該是變量類型的一部分来屠,因此不應(yīng)該和變量名放在一起。例如:應(yīng)該是String[] args震鹉,而不是 String args[] 俱笛。

4.8.4 switch語(yǔ)句

術(shù)語(yǔ)說明:switch語(yǔ)句是指在switch花括號(hào)中,包含了一組或多組語(yǔ)句塊传趾。每組語(yǔ)句塊都由一個(gè)或多個(gè)switch標(biāo)簽(例如case FOO:或者 default:)打頭迎膜。

4.8.4.1 縮進(jìn)

和其他語(yǔ)句塊一樣,switch花括號(hào)之后縮進(jìn)兩個(gè)字符浆兰。
每個(gè)switch標(biāo)簽之后磕仅,后面緊接的非標(biāo)簽的新行尘奏,按照花括號(hào)相同的處理方式縮進(jìn)兩個(gè)字符蝗拿。在標(biāo)簽結(jié)束后,恢復(fù)到之前的縮進(jìn)蛹找,類似花括號(hào)結(jié)束蜕便。

4.8.4.2 繼續(xù)向下執(zhí)行的注釋

在 switch語(yǔ)句中卸亮,每個(gè)標(biāo)簽對(duì)應(yīng)的代碼執(zhí)行完后,都應(yīng)該通過語(yǔ)句結(jié)束(例如:break玩裙、continue、return 或拋出異常)段直,否則應(yīng)該通過注釋說明吃溅,代碼需要繼續(xù)向下執(zhí)行下一個(gè)標(biāo)簽的代碼。注釋說明文字只要能說明代碼需要繼續(xù)往下執(zhí)行都可以(通常是 //fall through)鸯檬。這個(gè)注釋在最后一個(gè)標(biāo)簽之后不需要注釋决侈。例如:


這里寫圖片描述
4.8.4.3 default標(biāo)簽需要顯式聲明

每個(gè)switch語(yǔ)句中,都需要顯式聲明default標(biāo)簽。即使沒有任何代碼也需要顯示聲明赖歌。

4.8.5 Annotations

Annotations應(yīng)用到類枉圃、函數(shù)或者構(gòu)造函數(shù)時(shí),應(yīng)緊接javadoc之后庐冯。每一行只有一個(gè)Annotations孽亲。
Annotations所在行不受行長(zhǎng)度限制,也不需要增加縮進(jìn)展父。例如:


這里寫圖片描述

例外情況:
如果Annotations只有一個(gè)返劲,并且不帶參數(shù)。則它可以和類或方法名放在同一行栖茉。例如:


這里寫圖片描述

Annotations應(yīng)用到成員變量時(shí)篮绿,也是緊接javadoc之后。不同的是吕漂,多個(gè)annotations可以放在同一行亲配。例如:


這里寫圖片描述

對(duì)于參數(shù)或者局部變量使用Annotations的情況,沒有特定的規(guī)范惶凝。

4.8.6 注釋

4.8.6.1 語(yǔ)句塊的注釋風(fēng)格

注釋的縮進(jìn)與它所注釋的代碼縮進(jìn)相同吼虎。可以采用 /* / 進(jìn)行注釋梨睁,也可以用 // 進(jìn)行注釋鲸睛。當(dāng)使用 /*/ 進(jìn)行多行注釋時(shí),每一行都應(yīng)該以 * 開始坡贺, 并且 * 應(yīng)該上下對(duì)齊官辈。
例如:

這里寫圖片描述

多行注釋時(shí),如果你希望集成開發(fā)環(huán)境能自動(dòng)對(duì)齊注釋遍坟,你應(yīng)該使用 /**/拳亿, //一般不會(huì)自動(dòng)對(duì)齊。

4.8.7 修飾符

多個(gè)類和成員變量的修飾符愿伴,按Java Lauguage Specification中介紹的先后順序排序肺魁。具體是:


這里寫圖片描述

4.8.8 數(shù)字文字

long 值整型常量使用大寫L后綴,從來沒有小寫(避免與數(shù)字1混淆)隔节。例如:3000000000L而非3000000000l鹅经。

5、命名

5.1 適用于所有命名標(biāo)識(shí)符的通用規(guī)范

標(biāo)示符只應(yīng)該使用ASCII字母怎诫、數(shù)字和下劃線瘾晃,字母大小寫敏感。因此所有的標(biāo)示符幻妓,都應(yīng)該能匹配正則表達(dá)式 \w+ 蹦误。
Google Style中,標(biāo)示符不需要使用特殊的前綴或后綴,例如:name_, mName, s_name 和 kName强胰。

5.2 不同類型的標(biāo)示符規(guī)范

5.2.1 包名

包名全部用小寫字母舱沧,通過 . 將各級(jí)連在一起。不應(yīng)該使用下劃線偶洋。
例如:
com.example.deepspace熟吏,而不是com.example.deepSpace或com.example.deep_space 。

5.2.2 類名

類型的命名涡真,采用以大寫字母開頭的大小寫字符間隔的方式(UpperCamelCase)分俯。
class命名一般使用名詞或名詞短語(yǔ)。interface的命名有時(shí)也可以使用形容詞或形容詞短語(yǔ)哆料。annotation沒有明確固定的規(guī)范缸剪。

測(cè)試類的命名,應(yīng)該以它所測(cè)試的類的名字為開頭东亦,并在最后加上Test結(jié)尾杏节。例如:HashTest 、 HashIntegrationTest典阵。

5.2.3 方法名

方法命名奋渔,采用以小寫字母開頭的大小寫字符間隔的方式(lowerCamelCase)。
方法命名一般使用動(dòng)詞或者動(dòng)詞短語(yǔ)壮啊。

在JUnit的測(cè)試方法中嫉鲸,可以使用下劃線,用來區(qū)分測(cè)試邏輯的名字歹啼,經(jīng)常使用如下的結(jié)構(gòu):test_ 玄渗。例如:testPop_emptyStack 。
測(cè)試方法也可以用其他方式進(jìn)行命名狸眼。

5.2.4 常量名

常量命名藤树,全部使用大寫字符,詞與詞之間用下劃線隔開拓萌。(CONSTANCE_CASE)岁钓。

常 量是一個(gè)靜態(tài)成員變量,但不是所有的靜態(tài)成員變量都是常量微王。在選擇使用常量命名規(guī)則給變量命名時(shí)屡限,你需要明確這個(gè)變量是否是常量。例如炕倘,如果這個(gè)變量的狀 態(tài)可以發(fā)生改變钧大,那么這個(gè)變量幾乎可以肯定不是常量。只是計(jì)劃不會(huì)發(fā)生改變的變量不足以成為一個(gè)常量激才。下面是常量和非常量的例子:


這里寫圖片描述

常量一般使用名詞或者名詞短語(yǔ)命名。

5.2.5 非常量的成員變量名

非常量的成員變量命名(包括靜態(tài)變量和非靜態(tài)變量),采用lowerCamelCase命名瘸恼。
一般使用名詞或名詞短語(yǔ)劣挫。

5.2.6 參數(shù)名

參數(shù)命名采用lowerCamelCase命名。
應(yīng)該避免使用一個(gè)字符作為參數(shù)的命名方式东帅。

5.2.7 局部變量名

局部變量采用lowerCamelCase命名压固。它相對(duì)于其他類型的命名,可以采用更簡(jiǎn)短寬松的方式靠闭。
但即使如此帐我,也應(yīng)該盡量避免采用單個(gè)字母進(jìn)行命名的情況,除了在循環(huán)體內(nèi)使用的臨時(shí)變量愧膀。

即使局部變量是final拦键、不可改變的,它也不能被認(rèn)為是常量檩淋,也不應(yīng)該采用常量的命名方式去命名芬为。

5.2.8 類型名

類型名有兩種命名方式:

  1. 單獨(dú)一個(gè)大寫字母,有時(shí)后面再跟一個(gè)數(shù)字蟀悦。(例如媚朦,E、T日戈、X询张、T2)。
  2. 像一般的class命名一樣(見5.2.2節(jié))浙炼,再在最后接一個(gè)大寫字母份氧。(例如,RequestT鼓拧、FooBarT)半火。

5.3 Camel case的定義

有時(shí)一些短語(yǔ)被寫成Camel case的時(shí)候可以有多種寫法。例如一些縮寫詞匯季俩,或者一些組合詞:IPv6 或者 iOS 等钮糖。
為了統(tǒng)一寫法,Google style給出了一種幾乎可以確定為一種的寫法酌住。

  1. 將字符全部轉(zhuǎn)換為ASCII字符店归,并且去掉 ’ 等符號(hào)。例如酪我,”Müller’s algorithm” 被轉(zhuǎn)換為 “Muellers algorithm” 消痛。
  2. 將上一步轉(zhuǎn)換的結(jié)果拆分成一個(gè)一個(gè)的詞語(yǔ)。從空格處和從其他剩下的標(biāo)點(diǎn)符號(hào)處劃分都哭。
    注意:一些已經(jīng)是Camel case的詞語(yǔ)秩伞,也應(yīng)該在這個(gè)時(shí)候被拆分逞带。(例如 AdWords 被拆分為 ad words)。但是例如iOS之類的詞語(yǔ)纱新,它其實(shí)不是一個(gè)Camel case的詞語(yǔ)展氓,而是人們慣例使用的一個(gè)詞語(yǔ),因此不用做拆分脸爱。
  3. 經(jīng)過上面兩部后遇汞,先將所有的字母轉(zhuǎn)換為小寫,再把每個(gè)詞語(yǔ)的第一個(gè)字母轉(zhuǎn)換為大寫簿废。
  4. 最后空入,將所有詞語(yǔ)連在一起,形成一個(gè)標(biāo)示符族檬。

注意:詞語(yǔ)原來的大小寫規(guī)則歪赢,應(yīng)該被完全忽略。以下是一些例子:


這里寫圖片描述
  • 號(hào)表示可以接受导梆,但是不建議使用轨淌。

提示:有些詞語(yǔ)在英文中,可以用 - 連接使用看尼,也可以不使用 - 直接使用递鹉。例如 “nonempty”和 “non-empty”都是可以的。因此藏斩,方法名字為checkNonempty 或者checkNonEmpty 都是可以的躏结。

6、編程實(shí)踐

6.1 @Override 都應(yīng)該使用

@Override annotations只要是符合語(yǔ)法的狰域,都應(yīng)該使用媳拴。

例外:當(dāng)父類方法是@Deparecated時(shí)可省略@Override

6.2 異常捕獲 不應(yīng)該被忽略

一般情況下,catch住的異常不應(yīng)該被忽略兆览,而是都需要做適當(dāng)?shù)奶幚砬取@鐚㈠e(cuò)誤日志打印出來,或者如果認(rèn)為這種異常不會(huì)發(fā)生抬探,則應(yīng)該作為斷言異常重新拋出子巾。

如果這個(gè)catch住的異常確實(shí)不需要任何處理,也應(yīng)該通過注釋做出說明小压。例如:


這里寫圖片描述

例外:在測(cè)試類里线梗,有時(shí)會(huì)針對(duì)方法是否會(huì)拋出指定的異常,這樣的異常是可以被忽略的怠益。但是這個(gè)異常通常需要命名為: expected仪搔。例如:


這里寫圖片描述

6.3 靜態(tài)成員的訪問:應(yīng)該通過類,而不是對(duì)象

當(dāng)一個(gè)靜態(tài)成員被訪問時(shí)蜻牢,應(yīng)該通過class名去訪問烤咧,而不應(yīng)該使用這個(gè)class的具體實(shí)例對(duì)象偏陪。例如:


這里寫圖片描述

6.4 不使用Finalizers 方法

重載Object的finalize方法是非常非常罕見的。

注:不應(yīng)該使用這以方法煮嫌。如果你認(rèn)為你必須使用竹挡,請(qǐng)先仔細(xì)閱讀并理解 Effective Java 第七條 “Avoid Finalizers”。然后不要使用它立膛。

7、Javadoc

7.1 格式規(guī)范

7.1.1 通用格式

最基本的javadoc的通用格式如下例:


這里寫圖片描述

或者為單行格式:


這里寫圖片描述

通用格式在任何時(shí)候使用都是可以的梯码。當(dāng)javadoc塊只有一行時(shí)宝泵,可以使用單行格式來替代通用格式。

7.1.2 段落

空白行:是指javadoc中轩娶,上下兩個(gè)段落之間只有上下對(duì)齊的 * 字符的行儿奶。每個(gè)段落的第一行在第一個(gè)字符之前,有一個(gè)

標(biāo)簽鳄抒,并且之后不要有任何空格闯捎。

7.1.3 @從句

所有標(biāo)準(zhǔn)的@從句,應(yīng)該按照如下的順序添加:@param许溅、@return瓤鼻、@throws、@deprecated贤重。并且這四種@從句茬祷,不應(yīng)該出現(xiàn)在一個(gè)沒有描述的Javadoc塊中。
當(dāng)@從句無法在一行寫完時(shí)并蝗,應(yīng)該斷行祭犯。延續(xù)行在第一行的@字符的位置,縮進(jìn)至少4個(gè)字符單位滚停。

7.2 摘要片段

每個(gè)類或者成員的javadoc沃粗,都是由一個(gè)摘要片段開始的。這個(gè)片段非常重要键畴。因?yàn)樗穷惢蛘叻椒ㄔ谑褂脮r(shí)唯一能看到的文本說明最盅。
主要摘要只是一個(gè)片段,應(yīng)該是一個(gè)名詞短語(yǔ)或者動(dòng)詞短語(yǔ)镰吵,而不應(yīng)該是一個(gè)完整的句子檩禾。但是它應(yīng)該像一個(gè)完整的句子一樣使用標(biāo)點(diǎn)符號(hào)。

注意:一種常見的錯(cuò)誤是以這種形式使用javadoc:/** @return the customer ID* /.這是不對(duì)的疤祭。應(yīng)該改為:/** Returns the customer ID.* /.

7.3 何處應(yīng)該使用Javadoc

至少盼产,Javadoc應(yīng)該應(yīng)用于所有的public類、public和protected的成員變量和方法勺馆。和少量例外的情況戏售。例外情況如下侨核。

7.3.1 例外:方法本身已經(jīng)足夠說明的情況

當(dāng)方法本身很顯而易見時(shí),可以不需要javadoc灌灾。例如:getFoo搓译。沒有必要加上javadoc說明“Returns the foo”。
單元測(cè)試中的方法基本都能通過方法名锋喜,顯而易見地知道方法的作用些己。因此不需要增加javadoc。

注 意:有時(shí)候不應(yīng)該引用此例外嘿般,來省略一些用戶需要知道的信息段标。例如:getCannicalName 。當(dāng)大部分代碼閱讀者不知道canonical name是什么意思時(shí)炉奴,不應(yīng)該省略Javadoc,認(rèn)為只能寫/** Returns the canonical name.* / 逼庞。

7.3.2 例外:重載方法

重載方法有時(shí)不需要再寫Javadoc。

7.3.4 非必需的Javadoc

一些在包外不可見的class和成員變量或方法瞻赶,根據(jù)需要赛糟,也可以使用javadoc。

當(dāng)一個(gè)注釋用以說明這個(gè)類砸逊、變量或者方法的總體目標(biāo)或行為時(shí)璧南,該注釋應(yīng)使用Javadoc(使用/**)

</article>

</main>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市师逸,隨后出現(xiàn)的幾起案子穆咐,更是在濱河造成了極大的恐慌,老刑警劉巖字旭,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件对湃,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡遗淳,警方通過查閱死者的電腦和手機(jī)拍柒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來屈暗,“玉大人拆讯,你說我怎么就攤上這事⊙眩” “怎么了种呐?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)弃甥。 經(jīng)常有香客問我爽室,道長(zhǎng),這世上最難降的妖魔是什么淆攻? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任阔墩,我火速辦了婚禮嘿架,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘啸箫。我一直安慰自己耸彪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布忘苛。 她就那樣靜靜地躺著蝉娜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪扎唾。 梳的紋絲不亂的頭發(fā)上蜀肘,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音稽屏,去河邊找鬼。 笑死西乖,一個(gè)胖子當(dāng)著我的面吹牛狐榔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播获雕,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼薄腻,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了届案?” 一聲冷哼從身側(cè)響起庵楷,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎楣颠,沒想到半個(gè)月后尽纽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡童漩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年弄贿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片矫膨。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡差凹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出侧馅,到底是詐尸還是另有隱情危尿,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布馁痴,位于F島的核電站谊娇,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏罗晕。R本人自食惡果不足惜邮绿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一渠旁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧船逮,春花似錦顾腊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至酱鸭,卻和暖如春吗垮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背凹髓。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工烁登, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蔚舀。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓饵沧,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親赌躺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子狼牺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 1 介紹 這份文檔是Google Java編程風(fēng)格規(guī)范的完整定義。當(dāng)且僅當(dāng)一個(gè)Java源文件符合此文檔中的規(guī)則礼患, ...
    九都散人閱讀 998評(píng)論 1 2
  • 1 前言 這份文檔是Google Java編程風(fēng)格規(guī)范的完整定義是钥。當(dāng)且僅當(dāng)一個(gè)Java源文件符合此文檔中的規(guī)則,我...
    黑鼠_DEAN閱讀 1,156評(píng)論 0 1
  • [TOC] 前言 這份文檔是Google Java編程風(fēng)格規(guī)范的完整定義缅叠。當(dāng)且僅當(dāng)一個(gè)Java源文件符合此文檔中的...
    marine8888閱讀 1,942評(píng)論 0 1
  • 目錄前言源文件基礎(chǔ)源文件結(jié)構(gòu)格式命名約定編程實(shí)踐Javadoc后記 前言這份文檔是Google Java編程風(fēng)格規(guī)...
    燕京博士閱讀 426評(píng)論 1 1
  • 人間三月始芳菲 樹有新芽花含羞 雪翼翠釵曼曼舞 輕蝶循香絮絮飛 楊柳腰肢金蓮步 素面更比朱顏嬌 愁緒忘卻林幽處 暫...
    小詩(shī)歌喵閱讀 258評(píng)論 0 2