日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

[转载] Google Java代码规范

發(fā)布時(shí)間:2025/3/11 java 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [转载] Google Java代码规范 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

參考鏈接: 使用Java計(jì)算文本文件txt中的行數(shù)/單詞數(shù)/字符數(shù)和段落數(shù)

原文地址:https://google.github.io/styleguide/javaguide.html

GIthub上GoogleCode風(fēng)格的配置文件(支持Eclipse IDE和IntelliJ IDE):https://github.com/codeset/google-java-styleguide

1簡(jiǎn)介

?

本文檔作為Java編程語(yǔ)言中源代碼的Google編碼標(biāo)準(zhǔn)的完整定義。當(dāng)且僅當(dāng)它遵守本文中的規(guī)則時(shí),Java源文件被描述為在Google Style中。

與其他編程風(fēng)格指南一樣,所涵蓋的問(wèn)題不僅包括格式化的美學(xué)問(wèn)題,也包括其他類型的約定或編碼標(biāo)準(zhǔn)。但是,本文檔主要關(guān)注我們普遍遵循的快速規(guī)則 ,并避免提供不可明確強(qiáng)制執(zhí)行的建議(無(wú)論是通過(guò)人工還是工具)。

1.1術(shù)語(yǔ)注釋

在本文件中,除非另有說(shuō)明:

術(shù)語(yǔ)類被包含性地用于表示“普通”類,枚舉類,接口或注釋類型( @interface )。術(shù)語(yǔ)成員 (類的)包含地用于表示嵌套類,字段,方法或構(gòu)造函數(shù) ;即除了初始化器和注釋之外的類的所有頂級(jí)內(nèi)容。術(shù)語(yǔ)注釋總是指實(shí)現(xiàn)注釋。 我們不使用短語(yǔ)“文檔注釋”,而是使用通用術(shù)語(yǔ)“Javadoc”。

其他“術(shù)語(yǔ)說(shuō)明”將偶爾出現(xiàn)在整個(gè)文檔中。

1.2指南說(shuō)明

本文檔中的示例代碼是非規(guī)范的 。 也就是說(shuō),雖然示例是在Google風(fēng)格,但它們可能不會(huì)說(shuō)明代表代碼的唯一時(shí)尚的方式。 示例中所做的可選格式選擇不應(yīng)作為規(guī)則強(qiáng)制執(zhí)行。

2源文件基礎(chǔ)

2.1文件名

源文件名由其包含的頂級(jí)類(其中包含正好一個(gè) )的區(qū)分大小寫的名稱,以及.java擴(kuò)展名組成。

2.2文件編碼:UTF-8

源文件以UTF-8編碼。

2.3特殊字符

2.3.1空格字符

除了行終止符序列, ASCII水平空格字符 ( 0x20 )是在源文件中任何位置出現(xiàn)的唯一的空格字符。這意味著:

字符串和字符文字中的所有其他空白字符都將被轉(zhuǎn)義。制表符不用于縮進(jìn)。

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

對(duì)于具有特殊轉(zhuǎn)義序列 ( \b ,\t ,\n ,\f ,\r ,\" ,\'和\\ )的任何字符,使用該序列而不是相應(yīng)的八進(jìn)制Unicode(例如\u000a )轉(zhuǎn)義。

2.3.3非ASCII字符

對(duì)于剩余的非ASCII字符,使用實(shí)際的Unicode字符(例如∞ )或等效的Unicode轉(zhuǎn)義(例如\u221e )。 選擇僅取決于哪些使得代碼更容易閱讀和理解 ,盡管Unicode轉(zhuǎn)義字符串字面值和注釋強(qiáng)烈阻止。

提示:在Unicode脫機(jī)情況下,偶爾即使使用實(shí)際的Unicode字符,解釋性注釋也會(huì)非常有用。

例子:

例討論String unitAbbrev="μs";最好:完全清楚,即使沒(méi)有評(píng)論。String unitAbbrev="\u03bcs";// "μs"允許,但沒(méi)有理由這樣做。String unitAbbrev="\u03bcs";// Greek letter mu, "s"允許,但尷尬,容易犯錯(cuò)誤。String unitAbbrev = "\u03bcs";差:讀者不知道這是什么。return'\ufeff'+ content;// byte order mark良好:對(duì)不可打印字符使用轉(zhuǎn)義,如有必要,請(qǐng)注釋。

提示:不要因?yàn)槟承┏绦蚩赡軣o(wú)法正確處理非ASCII字符而使您的代碼變得不可讀。如果這應(yīng)該發(fā)生,那些程序被打破 ,它們必須是固定的 。

?

?

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

?

?源文件由以下順序組成 :

?許可或版權(quán)信息(如果存在)軟件包語(yǔ)句導(dǎo)入語(yǔ)句完全一個(gè)頂級(jí)類

?

正好一個(gè)空白線分隔存在的每個(gè)部分。

3.1許可或版權(quán)信息(如果存在)

如果許可證或版權(quán)信息屬于文件,則它屬于此處。

3.2包裝聲明

包語(yǔ)句不是線包裝 。 列限制(第4.4節(jié), 列限制:100 )不適用于包語(yǔ)句。

?

?

3.3導(dǎo)入語(yǔ)句

3.3.1無(wú)通配符導(dǎo)入

不使用靜態(tài)或其他方式的通配符導(dǎo)入 。

3.3.2沒(méi)有線包裝

導(dǎo)入語(yǔ)句不是線包裝的 。 列限制(第4.4節(jié), 列限制:100 )不適用于import語(yǔ)句。

3.3.3訂購(gòu)和間距

導(dǎo)入順序如下:

在單個(gè)塊中的所有靜態(tài)導(dǎo)入。所有非靜態(tài)導(dǎo)入在單個(gè)塊中。

如果存在靜態(tài)和非靜態(tài)導(dǎo)入,則單個(gè)空白行分隔兩個(gè)塊。 import語(yǔ)句之間沒(méi)有其他空行。

在每個(gè)塊中,導(dǎo)入的名稱以ASCII排序順序顯示。 ( 注意:這與以ASCII排序順序的import 語(yǔ)句不同 ,因?yàn)?#39;。'排在';'前面)。

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

靜態(tài)導(dǎo)入不用于靜態(tài)嵌套類。 它們以正常進(jìn)口進(jìn)口。

3.4類聲明

?

?

3.4.1完全一個(gè)頂級(jí)類聲明

每個(gè)頂級(jí)類都駐留在自己的源文件中。

?

?

3.4.2類內(nèi)容的排序

為類的成員和初始化器選擇的順序可以對(duì)可學(xué)習(xí)性有很大的影響。 然而,沒(méi)有一個(gè)正確的方法來(lái)做到這一點(diǎn); 不同的類可以以不同的方式對(duì)其內(nèi)容進(jìn)行排序。

重要的是每個(gè)類使用一些邏輯順序 ,維護(hù)者可以解釋如果問(wèn)。例如,新方法不僅習(xí)慣性地添加到類的末尾,因?yàn)檫@將產(chǎn)生“按照添加日期的順序”排序,這不是邏輯排序。

?

?

3.4.2.1重載:從不分裂

當(dāng)一個(gè)類有多個(gè)構(gòu)造函數(shù)或者多個(gè)同名的方法時(shí),這些順序出現(xiàn),中間沒(méi)有其他代碼(甚至不是私有成員)。

4格式化

術(shù)語(yǔ)注意: 塊狀構(gòu)造指的是類,方法或構(gòu)造函數(shù)的主體。注意,通過(guò)關(guān)于數(shù)組初始化器的第4.8.3.1節(jié),任何數(shù)組初始化器都可以被視為塊狀構(gòu)造。

?

?

4.1大括號(hào)

4.1.1在可選時(shí)使用括號(hào)

大括號(hào)與if ,else ,for ,do和while語(yǔ)句一起使用,即使主體為空或僅包含單個(gè)語(yǔ)句。

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

大括號(hào)遵循Kernighan和Ritchie風(fēng)格(“ 埃及括號(hào) ”)用于非空塊和塊狀結(jié)構(gòu):

在大括號(hào)前沒(méi)有換行符。開頭大括號(hào)后的換行符。換行前的換行。關(guān)閉大括號(hào)后的換行符, 僅當(dāng)該大括號(hào)終止語(yǔ)句或終止方法,構(gòu)造函數(shù)或命名類的主體時(shí)。例如,如果后面跟著else或逗號(hào),那么大括號(hào)后面沒(méi)有換行符。

例子:

?

?

?

??

? ?[java]?

? ?view plain

? ? copy

? ?

? ?

??

?

?return () -> {? ? while (condition()) {? ? ? method();? ? }? };? ? return new MyClass() {? ? @Override public void method() {? ? ? if (condition()) {? ? ? ? try {? ? ? ? ? something();? ? ? ? } catch (ProblemException e) {? ? ? ? ? recover();? ? ? ? }? ? ? } else if (otherCondition()) {? ? ? ? somethingElse();? ? ? } else {? ? ? ? lastThing();? ? ? }? ? }? };??

?

?

?

?

枚舉類的一些例外在第4.8.1節(jié)“枚舉類”中給出。

?

?

4.1.3空塊:可能簡(jiǎn)潔

空塊或塊狀構(gòu)造可以是K&R樣式(如第4.1.2節(jié)所述)。或者,它可以在打開后立即關(guān)閉,在({} )之間沒(méi)有字符或換行符,除非它是多塊語(yǔ)句的一部分 (直接包含多個(gè)塊:if/else或try/catch/finally)。

例子:

?

?

?

??

? ?[java]?

? ?view plain

? ? copy

? ?

? ?

??

?

?// This is acceptable? ? ?void doNothing() {}? ? ?// This is equally acceptable? ?void doNothingElse() {? ?}??

?

?

?

??

? ?[java]?

? ?view plain

? ? copy

? ?

? ?

??

?

?// This is not acceptable: No concise empty blocks in a multi-block statement? ?try {? ? ?doSomething();? ?} catch (Exception e) {}??

?

?

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

每次打開新的塊或塊狀構(gòu)造時(shí),縮進(jìn)增加兩個(gè)空格。 當(dāng)塊結(jié)束時(shí),縮進(jìn)返回到上一縮進(jìn)級(jí)別。 縮進(jìn)級(jí)別適用于整個(gè)塊中的代碼和注釋。 (請(qǐng)參見第4.1.2節(jié)“ 非空塊:K&R Style”中的示例。)

4.3每行一個(gè)語(yǔ)句

每個(gè)語(yǔ)句后面都有換行符。

?

?

4.4列限制:100

Java代碼的列限制為100個(gè)字符。 除非如下所述,否則超過(guò)此限制的任何行都必須被換行,如第4.5節(jié)“ 換行”中所述。

例外:

無(wú)法遵守列限制的行(例如,Javadoc中的長(zhǎng)URL或長(zhǎng)JSNI方法引用)。package和import語(yǔ)句(見第3.2節(jié)包語(yǔ)句和3.3導(dǎo)入語(yǔ)句 )。注釋中的命令行可以剪切并粘貼到shell中。

4.5線包裝

術(shù)語(yǔ)注意:當(dāng)可能合法占用單個(gè)行的代碼被分為多行時(shí),此活動(dòng)稱為行換行 。

沒(méi)有全面的,確定性的公式,顯示每種情況下如何包裝。 通常有幾種有效的方法來(lái)?yè)Q行同一段代碼。

注意:雖然換行的典型原因是為了避免溢出列限制,即使在事實(shí)上符合列限制的代碼也可能由作者自行決定。

提示:提取方法或局部變量可以解決問(wèn)題,而不需要換行。

4.5.1打破的地方

線包裝的主要指令是:更喜歡在更高的語(yǔ)法層面打破。 也:

當(dāng)在非賦值運(yùn)算符處斷開一行時(shí),中斷在符號(hào)之前 。 (請(qǐng)注意,這與其他語(yǔ)言(例如C ++和JavaScript)在Google樣式中使用的做法不同)。

? 這也適用于以下“類似運(yùn)算符”的符號(hào):

? ? 點(diǎn)分隔符( . )方法引用(::)的兩個(gè)冒號(hào)類型邊界中的<TextendsFoo&Bar>符號(hào)(<TextendsFoo&Bar> )在catch塊中的一個(gè)管道( catch (FooException|BarException e) )。當(dāng)一個(gè)行在賦值操作符中斷時(shí),中斷通常出現(xiàn)在符號(hào)之后 ,但是任何一種方式都是可以接受的。

? 這也適用于增強(qiáng)型for (“foreach”)語(yǔ)句中的“賦值運(yùn)算符”冒號(hào)。方法或構(gòu)造函數(shù)名稱附加到它后面的開括號(hào)( ( ))。逗號(hào)( , )保持附加到它前面的令牌。在lambda中,一行從不會(huì)被折斷,除了如果lambda的主體由單個(gè)非支持表達(dá)式組成,則可能會(huì)在箭頭之后立即出現(xiàn)中斷。例子:

??

? ?

? ??

? ? ?[java]?

? ? ?view plain

? ? ? copy

? ? ?

? ? ?

? ??

? ?

? ?MyLambda<String, Long, Object> lambda =? ? ? (String label, Long value, Object obj) -> {? ? ? ? ? ...? ? ? };? ? Predicate<String> predicate = str ->? ? ? longExpressionInvolving(str);??

??

注意:換行的主要目標(biāo)是具有清除代碼, 不一定代碼適合最小的行數(shù)。

?

?

4.5.2縮進(jìn)連續(xù)線至少+4個(gè)空格

當(dāng)換行時(shí),第一行(每個(gè)連續(xù)行 )后面的每一行從原始行縮進(jìn)至少+4。

當(dāng)存在多個(gè)連續(xù)線時(shí),根據(jù)需要,壓痕可以變化超過(guò)+4。 一般來(lái)說(shuō),當(dāng)且僅當(dāng)它們以句法并行元素開頭時(shí),兩個(gè)連續(xù)行使用相同的縮進(jìn)級(jí)別。

關(guān)于水平對(duì)齊的第4.6.3節(jié)闡述了使用可變數(shù)量的空間將某些令牌與先前的行對(duì)齊的不鼓勵(lì)做法。

4.6空白

4.6.1垂直空白

將顯示一個(gè)空白行:

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

? 異常:兩個(gè)連續(xù)字段之間的空行(它們之間沒(méi)有其他代碼)是可選的。這樣的空白行根據(jù)需要用于創(chuàng)建字段的邏輯分組 。異常:枚舉常量之間的空行在第4.8.1節(jié)中介紹 。在語(yǔ)句之間, 根據(jù)需要將代碼組織成邏輯子部分。可選地在第一個(gè)成員或初始化程序之前,或在類的最后一個(gè)成員或初始化程序之后(既不鼓勵(lì)也不鼓勵(lì))。根據(jù)本文檔其他部分的要求(如第3節(jié), 源文件結(jié)構(gòu)和第3.3節(jié), 導(dǎo)入語(yǔ)句 )。

允許多個(gè)連續(xù)的空行,但不需要(或鼓勵(lì))。

4.6.2水平空白

除了語(yǔ)言或其他樣式規(guī)則所要求的之外,除了文字,注釋和Javadoc之外,單個(gè)ASCII空間也僅出現(xiàn)在以下位置。

將任何保留字(例如if ,for或catch )從該行后面的開括號(hào)(( ))中分離將任何保留字(例如else或catch )與該行上的關(guān)閉大括號(hào)(} )分隔開在任何打開的大括號(hào)( { )之前,有兩個(gè)例外:

? @SomeAnnotation({a, b}) (不使用空格)String[][] x={{"foo"}};({{下面第8項(xiàng))之間不需要空格,在任何二進(jìn)制或三元運(yùn)算符的兩側(cè)。 這也適用于以下“類似運(yùn)算符”的符號(hào):

? 連接符類型的連接<TextendsFoo&Bar> :<TextendsFoo&Bar>用于處理多個(gè)異常的catch塊的管道: catch (FooException|BarException e)冒號(hào)(:)在增強(qiáng)型for (“foreach”)語(yǔ)句中l(wèi)ambda表達(dá)式中的箭頭: (String str)-> str.length()但不是

? 一個(gè)方法引用的兩個(gè)冒號(hào)(::),它寫得像Object::toString點(diǎn)分隔符( . ),它寫作object.toString()后,:;或右括號(hào)() )在開始結(jié)束行注釋的雙斜線( // )的兩側(cè)。 這里,允許多個(gè)空格,但不是必需的。在一個(gè)聲明的類型和變量之間: List<String> list可選只在數(shù)組初始值設(shè)定符的兩個(gè)大括號(hào)內(nèi)

? newint[]{5,6}和newint[]{5,6}都是有效的

此規(guī)則從不解釋為在行的開始或結(jié)束處要求或禁止額外的空間;

?

它只涉及內(nèi)部空間。

?

4.6.3水平對(duì)齊:從不需要

術(shù)語(yǔ)注意: 水平對(duì)齊是在代碼中添加可變數(shù)量的附加空間的做法,目的是使某些令牌直接顯示在之前行上的某些其他令牌下方。

這種做法是允許的,但Google風(fēng)格從不需要 。 甚至不需要在已經(jīng)使用的地方保持水平對(duì)準(zhǔn)。

這里是一個(gè)沒(méi)有對(duì)齊的例子,然后使用對(duì)齊:

?

?

?

??

? ?[java]?

? ?view plain

? ? copy

? ?

? ?

??

?

?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??

?

?

提示:

對(duì)齊可以幫助可讀性,但它會(huì)為以后的維護(hù)帶來(lái)問(wèn)題。

考慮一個(gè)需要觸摸只有一行的未來(lái)變化。

這種變化可能會(huì)使以前令人愉快的格式化失敗,這是允許的 。

更頻繁地,它提示編碼器(也許你)調(diào)整附近線上的空白,可能觸發(fā)級(jí)聯(lián)系列的重新格式化。

那一行的變化現(xiàn)在有一個(gè)“爆炸半徑”。

這可能在最壞的情況下導(dǎo)致無(wú)意義的繁忙工作,但最多仍會(huì)破壞版本歷史信息,減慢審閱者和加劇合并沖突。

?

?

?

4.7分組括號(hào):推薦

可選的分組括號(hào)只有在作者和審稿人同意沒(méi)有合理的機(jī)會(huì),沒(méi)有他們的代碼將被誤解,他們也不會(huì)使代碼更容易閱讀。假設(shè)每個(gè)讀取器都具有存儲(chǔ)的整個(gè)Java運(yùn)算符優(yōu)先級(jí)表是不合理的。

4.8特定構(gòu)建體

4.8.1枚舉類

在遵循枚舉常量的每個(gè)逗號(hào)后,換行符是可選的。 還允許附加空行(通常只有一個(gè))。 這是一個(gè)可能性:

?

?

?

??

? ?[java]?

? ?view plain

? ? copy

? ?

? ?

??

?

?private enum Answer {? ? ? YES {? ? ? @Override public String toString() {? ? ? ? return "yes";? ? ? }? ? },? ? ? NO,? ? MAYBE? }??

?

?

沒(méi)有方法和沒(méi)有文檔的常量的枚舉類可以可選地被格式化為數(shù)組初始化器(見關(guān)于數(shù)組初始化器的第4.8.3.1節(jié))。

?

?

?

?

??

? ?[java]?

? ?view plain

? ? copy

? ?

? ?

??

?

?privete enum Clothes{CLUBS,HEARTS,SPADES,DIAMONDS}??

?

?

由于枚舉類是類 ,因此適用于格式化類的所有其他規(guī)則。

?

?

?

?

4.8.2變量聲明

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

每個(gè)變量聲明(字段或本地)只聲明一個(gè)變量:聲明如int a, b;不使用。

4.8.2.2需要時(shí)聲明

局部變量不習(xí)慣地在它們的包含塊或塊狀構(gòu)造的開始處聲明。 相反,局部變量被聲明為接近它們首次使用的點(diǎn)(在原因內(nèi)),以最小化它們的范圍。 局部變量聲明通常具有初始化器,或者在聲明之后立即初始化。

4.8.3數(shù)組

4.8.3.1數(shù)組初始化器:可以是“塊狀”

任何數(shù)組初始化器可以可選地被格式化為好像它是“塊狀構(gòu)造”。 例如,以下都是有效的( 不是詳盡的列表):

?

?

?

??

? ?[java]?

? ?view plain

? ? copy

? ?

? ?

??

?

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

?

?

4.8.3.2沒(méi)有C樣式數(shù)組聲明

方括號(hào)形成類型的一部分,而不是變量: String[] args ,而不是String args[] 。

4.8.4切換語(yǔ)句

術(shù)語(yǔ)注意: 交換機(jī)塊的大括號(hào)內(nèi)是一個(gè)或多個(gè)語(yǔ)句組 。每個(gè)語(yǔ)句組由一個(gè)或多個(gè)開關(guān)標(biāo)簽 (無(wú)論是caseFOO:或default: :)組成,后跟一個(gè)或多個(gè)語(yǔ)句。

4.8.4.1縮進(jìn)

與任何其他塊一樣,開關(guān)塊的內(nèi)容縮進(jìn)+2。

在切換標(biāo)簽之后,有一個(gè)換行符,縮進(jìn)級(jí)別增加+2,就像打開一個(gè)塊一樣。 以下開關(guān)標(biāo)簽返回到上一縮進(jìn)級(jí)別,如同一個(gè)塊已關(guān)閉。

?

?

4.8.4.2通過(guò):評(píng)論

在開關(guān)塊內(nèi),每個(gè)語(yǔ)句組都會(huì)突然終止(使用break ,continue ,return或thrown異常),或者標(biāo)記有注釋,指示執(zhí)行將繼續(xù)或可能繼續(xù)到下一個(gè)語(yǔ)句組。任何傳達(dá)墮落想法的評(píng)論都是足夠的(通常// fall through )。在開關(guān)組的最后一個(gè)語(yǔ)句組中不需要此特殊注釋。例:

?

?

?

??

? ?[java]?

? ?view plain

? ? copy

? ?

? ?

??

?

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

?

?

注意,在

case1:

之后不需要注釋,只在語(yǔ)句組的末尾。

?

4.8.4.3 default情況存在

每個(gè)switch語(yǔ)句包括一個(gè)default語(yǔ)句組,即使它不包含代碼。

?

?

4.8.5注釋

應(yīng)用于類,方法或構(gòu)造函數(shù)的注釋立即出現(xiàn)在文檔塊之后,并且每個(gè)注釋都列在其自己的行(即每行一個(gè)注釋)上。這些換行符不構(gòu)成換行(第4.5節(jié),換行 ),因此縮進(jìn)級(jí)別不會(huì)增加。 例:

?

?

?

??

? ?[java]?

? ?view plain

? ? copy

? ?

? ?

??

?

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

?

?

異常:

?

單個(gè)

無(wú)參數(shù)注釋

可以

改為與簽名的第一行一起出現(xiàn),例如:

?

?

?

?

??

? ?[java]?

? ?view plain

? ? copy

? ?

? ?

??

?

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

?

?

應(yīng)用于字段的注釋也會(huì)立即出現(xiàn)在文檔塊之后,但在這種情況下,?

多個(gè)

注釋(可能已參數(shù)化)可能會(huì)列在同一行上;

例如:

?

?

?

?

??

? ?[java]?

? ?view plain

? ? copy

? ?

? ?

??

?

?@Partial @Mock DataLoader loader;??

?

?

沒(méi)有關(guān)于參數(shù),局部變量或類型的注釋格式化的具體規(guī)則。

?

?

?

4.8.6評(píng)論

本節(jié)討論實(shí)現(xiàn)注釋 。 Javadoc在第7節(jié)Javadoc中單獨(dú)解決。

任何換行符之前可以有任意空格,然后是實(shí)現(xiàn)注釋。 這樣的注釋使該行非空白。

4.8.6.1塊注釋樣式

塊注釋縮進(jìn)到與周圍代碼相同的級(jí)別。 它們可以是/* ... */ style或// ...樣式。 對(duì)于多行/* ... */注釋,后續(xù)行必須以*與上一行的*對(duì)齊開始。

?

?

?

??

? ?[java]?

? ?view plain

? ? copy

? ?

? ?

??

?

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

?

?

注釋不包含在用星號(hào)或其他字符繪制的框中。

?

提示:在編寫多行注釋時(shí),如果您希望自動(dòng)代碼格式化程序在必要時(shí)重新?lián)Q行(段落樣式),請(qǐng)使用/* ... */樣式。大多數(shù)格式化程序不會(huì)在// ...樣式注釋塊中重新?lián)Q行。

?

?

4.8.7修飾符

類和成員修飾符(如果存在)按照J(rèn)ava語(yǔ)言規(guī)范建議的順序顯示:

?

?

?

??

? ?[java]?

? ?view plain

? ? copy

? ?

? ?

??

?

?public protected private abstract default static final transient volatile synchronized native strictfp??

?

?

4.8.8數(shù)字文字

long整數(shù)文字使用大寫L后綴,從不小寫(以避免與數(shù)字1混淆)。例如,3000000000L而不是3000000000l 。

?

?

5命名

5.1所有標(biāo)識(shí)符共有的規(guī)則

標(biāo)識(shí)符只使用ASCII字母和數(shù)字,并且在下面指出的少數(shù)情況下,下劃線。 因此,每個(gè)有效的標(biāo)識(shí)符名稱由正則表達(dá)式\w+匹配。

在Google Style中,特殊的前綴或后綴,如在示例name_ ,mName ,s_name和kName中看到的,不使用。

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

5.2.1包名稱

包名稱都是小寫,連續(xù)的單詞連接在一起(無(wú)下劃線)。 例如, com.example.deepspace ,而不是com.example.deepSpace或com.example.deep_space 。

5.2.2類名

類名寫在UpperCamelCase中 。

類名通常是名詞或名詞短語(yǔ)。 例如, Character或ImmutableList 。接口名稱也可以是名詞或名詞短語(yǔ)(例如,List ),但有時(shí)可以是形容詞或形容詞短語(yǔ)(例如,Readable )。

沒(méi)有特定的規(guī)則,甚至沒(méi)有成熟的慣例為命名注釋類型。

測(cè)試類從它們正在測(cè)試的類的名稱開始命名,并以Test結(jié)束。例如,HashTest或HashIntegrationTest 。

5.2.3方法名稱

方法名稱寫在lowerCamelCase中 。

方法名稱通常是動(dòng)詞或動(dòng)詞短語(yǔ)。 例如,sendMessage或stop 。

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

?

?

5.2.4常量名稱

常量名稱使用CONSTANT_CASE :所有大寫字母,用下劃線分隔的單詞。但什么是常數(shù),究竟是什么?

常數(shù)是靜態(tài)最終字段,其內(nèi)容是不可變的,并且其方法沒(méi)有可檢測(cè)的副作用。 這包括基元,字符串,不可變類型和不可變類型的不可變集合。 如果任何實(shí)例的observable狀態(tài)可以改變,它不是一個(gè)常量。只是打算從來(lái)不改變對(duì)象是不夠的。例子:

?

?

?

??

? ?[java]?

? ?view plain

? ? copy

? ?

? ?

??

?

?// Constants? static final int NUMBER = 5;? static final ImmutableList<String> NAMES = ImmutableList.of("Ed", "Ann");? static final ImmutableMap<String, Integer> AGES = ImmutableMap.of("Ed", 35, "Ann", 32);? 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 ImmutableMap<String, SomeMutableType> mutableValues =? ? ? ImmutableMap.of("Ed", mutableInstance, "Ann", mutableInstance2);? static final Logger logger = Logger.getLogger(MyClass.getName());? static final String[] nonEmptyArray = {"these", "can", "change"};??

?

?

這些名稱通常是名詞或名詞短語(yǔ)。

?

5.2.5非常量字段名稱

非常量字段名(靜態(tài)或其他)寫在lowerCamelCase中 。

這些名稱通常是名詞或名詞短語(yǔ)。 例如,computedValues或index 。

5.2.6參數(shù)名稱

參數(shù)名稱寫在lowerCamelCase中 。

應(yīng)該避免公共方法中的單字符參數(shù)名稱。

5.2.7局部變量名

局部變量名寫在lowerCamelCase中 。

即使最終和不可變的局部變量不被認(rèn)為是常量,并且不應(yīng)該被定型為常量。

5.2.8類型變量名

每個(gè)類型變量都以兩種樣式之一命名:

單個(gè)大寫字母,可選后跟單個(gè)數(shù)字(例如E ,T ,X ,T2 )用于類的形式的名稱(見第5.2.2節(jié), 類名 ),后跟大寫字母T (示例:RequestT,FooBarT )。

?

?

?

5.3駱駝情況:定義

有時(shí),有一個(gè)以上的合理方式將英語(yǔ)短語(yǔ)轉(zhuǎn)換為駱駝情況,例如當(dāng)首字母縮略詞或不尋常的結(jié)構(gòu),如“IPv6”或“iOS”存在。為了提高可預(yù)測(cè)性,Google Style指定以下(幾乎)確定性方案。

從名稱的散文形式開始:

將短語(yǔ)轉(zhuǎn)換為純ASCII并刪除任何省略號(hào)。 例如,“Müller算法”可能變成“Muellers算法”。將此結(jié)果劃分為單詞,分割為空格和任何剩余的標(biāo)點(diǎn)符號(hào)(通常為連字符)。

? 推薦:如果任何字詞在常用的情況下已經(jīng)具有常規(guī)的駝峰盒外觀,請(qǐng)將其分為其組成部分(例如,“AdWords”成為“廣告字詞”)。注意,諸如“iOS”這樣的詞本身不是真正的駱駝情況;它違反任何慣例,因此本建議不適用。現(xiàn)在小寫一切 (包括首字母縮略詞),然后大寫只有第一個(gè)字符:

? ...每個(gè)字,產(chǎn)生上駱駝殼 ,或...每個(gè)字除了第一個(gè),產(chǎn)生較低的駝峰盒最后,將所有單詞連接成單個(gè)標(biāo)識(shí)符。

注意,原始單詞的殼體幾乎完全被忽略。 例子:

散文形式正確不正確“XML HTTP請(qǐng)求”XmlHttpRequestXMLHTTPRequest“新客戶ID”newCustomerIdnewCustomerID“內(nèi)部秒表”innerStopwatchinnerStopWatch“在iOS上支持IPv6?supportsIpv6OnIossupportsIPv6OnIOS“YouTube進(jìn)口商”YouTubeImporterYoutubeImporter *?

*可接受,但不推薦。

注意:某些單詞在英語(yǔ)中有不明確的連字符:例如“nonempty”和“non-empty”都是正確的,所以方法名稱checkNonempty和checkNonEmpty也是正確的。

6編程實(shí)踐

6.1@Override :始終使用

一個(gè)方法在合法時(shí)用@Override注釋標(biāo)記。這包括重寫超類方法的類方法,實(shí)現(xiàn)接口方法的類方法和重定義超接口方法的接口方法。

異常:當(dāng)父方法為@Deprecated時(shí),可以省略@Deprecated 。

?

?

6.2捕獲異常:不被忽略

除非如下所述,在響應(yīng)捕獲的異常時(shí)不執(zhí)行任何操作是非常不正確的。 (典型的響應(yīng)是記錄它,或者如果它被認(rèn)為是“不可能”,將其重新拋出為一個(gè)AssertionError 。)

當(dāng)在catch塊中沒(méi)有采取任何行動(dòng)是真正合適的時(shí)候,這是合理的原因在注釋中解釋。

?

?

?

??

? ?[java]?

? ?view plain

? ? copy

? ?

? ?

??

?

?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è)試中,如果捕獲的異常名稱為或以

expected

開始,

可以忽略捕獲的異常而不進(jìn)行注釋。

以下是一個(gè)非常常見的用于確保測(cè)試中的代碼確實(shí)拋出了預(yù)期類型的??異常的習(xí)語(yǔ),因此在此不需要注釋。

?

?

?

?

??

? ?[java]?

? ?view plain

? ? copy

? ?

? ?

??

?

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

?

?

6.3靜態(tài)成員:使用類合格

當(dāng)對(duì)靜態(tài)類成員的引用必須限定時(shí),它將使用該類的名稱限定,而不是該類的類型的引用或表達(dá)式。

?

Foo aFoo = ...;

Foo.aStaticMethod(); // good

aFoo.aStaticMethod(); // bad

somethingThatYieldsAFoo().aStaticMethod(); // very bad

?

?

6.4終化劑:未使用

覆蓋Object.finalize是非常罕見的 。

提示:不要這樣做。 如果你絕對(duì)必須,首先閱讀并理解有效的Java項(xiàng)目7,“避免終結(jié)者”,非常仔細(xì),然后不這樣做。

?

?

7 Javadoc

7.1格式化

7.1.1一般形式

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

?

?

?

??

? ?[java]?

? ?view plain

? ? copy

? ?

? ?

??

?

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

?

?

...或在此單行示例中:

?

?

?

?

??

? ?[java]?

? ?view plain

? ? copy

? ?

? ?

??

?

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

?

?

基本形式總是可以接受的。?

當(dāng)不存在at-clause時(shí),單行形式可以被替換,并且Javadoc塊(包括注釋標(biāo)記)的整體可以適合在單個(gè)行上。

?

7.1.2段落

一個(gè)空行(即,僅包含對(duì)齊的前導(dǎo)星號(hào)( * )的行)出現(xiàn)在段落之間,并在“at-clause”組(如果存在)之前。每個(gè)段落,但第一個(gè)在緊接第一個(gè)單詞之前有<p>后面沒(méi)有空格。

7.1.3條款

任何使用的標(biāo)準(zhǔn)“at- @deprecated ”都出現(xiàn)在@param@deprecated ,@return@deprecated , @return , @param@deprecated這些@deprecated ,并且這四種類型不會(huì)出現(xiàn)空描述。當(dāng)at-clause不適合單個(gè)行時(shí),連續(xù)行從@的位置縮進(jìn)四(或更多)個(gè)空格。

7.2摘要片段

每個(gè)Javadoc塊以簡(jiǎn)短摘要片段開頭。 這個(gè)片段非常重要:它是出現(xiàn)在某些上下文中的文本的唯一部分,例如類和方法索引。

這是一個(gè)片段 - 一個(gè)名詞短語(yǔ)或動(dòng)詞短語(yǔ),而不是一個(gè)完整的句子。 它不以A {@code Foo} is a...開頭A {@code Foo} is a... ,或者This method returns... ,也不會(huì)形成一個(gè)完整的命令句,如Save the record.。然而,片段被大寫和標(biāo)點(diǎn),好像它是一個(gè)完整的句子。

提示:常見的錯(cuò)誤是以/** @return the customer ID */編寫簡(jiǎn)單的Javadoc。這是不正確的,應(yīng)該更改為/** Returns the customer ID. *//** Returns the customer ID. */ 。

?

?

7.3其中使用Javadoc

至少 ,Javadoc存在于每個(gè)public類以及這種類的每個(gè)public或protected成員,除了下面列出的一些例外。

還可能存在其他Javadoc內(nèi)容,如第7.3.4節(jié)“ 非必需Javadoc”中所述。

7.3.1異常:自明的方法

Javadoc對(duì)于“簡(jiǎn)單的,明顯的”方法(如getFoo是可選的,在真正和真正沒(méi)有什么別的值得說(shuō),但“返回foo”。

重要提示:引用此例外是不恰當(dāng)?shù)?#xff0c;因?yàn)槭÷粤说湫妥x者可能需要知道的相關(guān)信息。例如,對(duì)于名為getCanonicalName的方法,不要省略其文檔(只有/** Returns the canonical name. */ ),如果典型的讀者可能不知道術(shù)語(yǔ)“canonical name”手段!

7.3.2異常:覆蓋

Javadoc并不總是出現(xiàn)在覆蓋超類型方法的方法上。

7.3.4非必需Javadoc

其他類和成員根據(jù)需要或期望具有Javadoc。

每當(dāng)實(shí)現(xiàn)注釋用于定義類或成員的總體目的或行為時(shí),該注釋將改為寫為Javadoc(使用/** )。

非必需的Javadoc不是嚴(yán)格要求遵守第7.1.2,7.1.3和7.2節(jié)的格式化規(guī)則,但當(dāng)然是建議。

總結(jié)

以上是生活随笔為你收集整理的[转载] Google Java代码规范的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。