written by leo.wang
Android代碼開(kāi)發(fā)規(guī)范
1 類聲明
1.1 只有一個(gè)頂級(jí)
類聲明每個(gè)頂級(jí)類都在一個(gè)與它同名的源文件中(當(dāng)然,還包含.java后綴)。
例外:package-info.java,該文件中可沒(méi)有package-info類。
1.2 類成員順序
按照android studio的默認(rèn)順序排序
1.2.1 區(qū)塊劃分
建議使用注釋將源文件分為明顯的區(qū)塊,區(qū)塊劃分如下
1.常量聲明區(qū)
2.UI控件成員變量聲明區(qū)
3.普通成員變量聲明區(qū)
4.內(nèi)部接口聲明區(qū)
5.初始化相關(guān)方法區(qū)
6.事件響應(yīng)方法區(qū)
7.普通邏輯方法區(qū)
8.重載的邏輯方法區(qū)
9.發(fā)起異步任務(wù)方法區(qū)
10.異步任務(wù)回調(diào)方法區(qū)
11.生命周期回調(diào)方法區(qū)(出去onCreate()方法)
12.內(nèi)部類聲明區(qū)
1.2.2 類成員排列通用規(guī)則(盡量保持)
1.按照發(fā)生的先后順序排列
2.常量按照使用先后排列
3.UI控件成員變量按照l(shuí)ayout文件中的先后順序排列
4.普通成員變量按照使用的先后順序排列
5.方法基本上都按照調(diào)用的先后順序在各自區(qū)塊中排列
6.相關(guān)功能作為小區(qū)塊放在一起(或者封裝掉)
1.2.3 重載:永不分離
當(dāng)一個(gè)類有多個(gè)構(gòu)造函數(shù),或是多個(gè)同名方法,這些函數(shù)/方法應(yīng)該按順序出現(xiàn)在一起,中間不要放進(jìn)其它函數(shù)/方法。
2 格式術(shù)語(yǔ)
說(shuō)明:塊狀結(jié)構(gòu)(block-like construct)指的是一個(gè)類,方法或構(gòu)造函數(shù)的主體。需要注意的是,數(shù)組初始化中的初始值可被選擇性地視為塊狀結(jié)構(gòu)(4.8.3.1節(jié))。
2.1 大括號(hào)
2.1.1 使用大括號(hào)(即使是可選的)
大括號(hào)與if, else, for, do, while語(yǔ)句一起使用,即使只有一條語(yǔ)句(或是空),也應(yīng)該把大括號(hào)寫上。
2.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è)語(yǔ)句、函數(shù)體或類的終止,則右大括號(hào)后換行; 否則不換行。
例如,如果右大括號(hào)后面是else或逗號(hào),則不換行。
示例:
<pre>
return new MyClass() {
@Override public void method() {
if (condition()) {
try {
something();
} catch (ProblemException e) {
recover();
}
}
}
};
</pre>
2.1.3 空塊:可以用簡(jiǎn)潔版本
一個(gè)空的塊狀結(jié)構(gòu)里什么也不包含,大括號(hào)可以簡(jiǎn)潔地寫成{},不需要換行。
例外:如果它是一個(gè)多塊語(yǔ)句的一部分(if/else 或 try/catch/finally) ,即使大括號(hào)內(nèi)沒(méi)內(nèi)容,右大括號(hào)也要換行。
示例:
<pre>
void doNothing() {}
</pre>
2.2 快縮進(jìn):4個(gè)空格
每當(dāng)開(kāi)始一個(gè)新的塊,縮進(jìn)增加4個(gè)空格,當(dāng)塊結(jié)束時(shí),縮進(jìn)返回先前的縮進(jìn)級(jí)別??s進(jìn)級(jí)別適用于代碼和注釋。
2.3 一行一個(gè)語(yǔ)句。
沒(méi)個(gè)語(yǔ)句后要換行。
2.4 列限制。
一個(gè)項(xiàng)目可以選擇一行80個(gè)字符或100個(gè)字符的列限制,除了下述例外,任何一行如果超過(guò)這個(gè)字符數(shù)限制,必須自動(dòng)換行。
例外:
- 不可能滿足列限制的行(例如,Javadoc中的一個(gè)長(zhǎng)URL,或是一個(gè)長(zhǎng)的JSNI方法參考)。
- package和import語(yǔ)句。
- 注釋中那些可能被剪切并粘貼到shell中的命令行。
2.5 自動(dòng)換行
術(shù)語(yǔ)說(shuō)明:一般情況下,一行長(zhǎng)代碼為了避免超出列限制(80或100個(gè)字符)而被分為多行,我們稱之為自動(dòng)換行(line-wrapping)。我們并沒(méi)有全面,確定性的準(zhǔn)則來(lái)決定在每一種情況下如何自動(dòng)換行。很多時(shí)候,對(duì)于同一段代碼會(huì)有好幾種有效的自動(dòng)換行方式。
2.5.1 那里斷開(kāi).
自動(dòng)換行的基本準(zhǔn)則是:更傾向于在更高的語(yǔ)法級(jí)別處斷開(kāi)。
1.如果在非賦值運(yùn)算符處斷開(kāi),那么在該符號(hào)前斷開(kāi)(比如+,它將位于下一行)。注意:這一點(diǎn)與 Google 其它語(yǔ)言的編程風(fēng)格不同(如 C++ 和 JavaScript )。
2.這條規(guī)則也適用于以下"類運(yùn)算符"符號(hào):點(diǎn)分隔符(.),類型界限中的 &(),catch 塊中的管道符號(hào)(catch (FooException | BarException e)
3.如果在賦值運(yùn)算符處斷開(kāi),通常的做法是在該符號(hào)后斷開(kāi)(比如=,它與前面的內(nèi)容留在同一行)。這條規(guī)則也適用于foreach語(yǔ)句中的分號(hào)。
4.方法名或構(gòu)造函數(shù)名與左括號(hào)留在同一行.
5.逗號(hào)(,)與其前面的內(nèi)容留在同一行。
2.5.2 自動(dòng)換行縮進(jìn)至少需要8個(gè)空格
自動(dòng)換行時(shí),第一行后的每一行至少比第一行多縮進(jìn)8個(gè)空格(注意:制表符不用于縮進(jìn)。)。當(dāng)存在連續(xù)自動(dòng)換行時(shí),縮進(jìn)可能會(huì)多縮進(jìn)不只8個(gè)空格(語(yǔ)法元素存在多級(jí)時(shí))。一般而言,兩個(gè)連續(xù)行使用相同的縮進(jìn)當(dāng)且僅當(dāng)它們開(kāi)始于同級(jí)語(yǔ)法元素。
2.6 空白
2.6.1 垂直空白
以下情況需要使用一個(gè)空行:
1.類內(nèi)連續(xù)的成員之間:字段,構(gòu)造函數(shù),方法,嵌套類,靜態(tài)初始化塊,實(shí)例初始化塊。 例外: 兩個(gè)連續(xù)字段之間的空行是可選的,用于字段的空行主要用來(lái)對(duì)字段進(jìn)行邏輯分組。
2.在函數(shù)體內(nèi),語(yǔ)句的邏輯分組間使用空行。
3.類內(nèi)的第一個(gè)成員前或最后一個(gè)成員后的空行是可選的(既不鼓勵(lì)也不反對(duì)這樣做,視個(gè)人喜好而定)。
4.要滿足本文檔中其他節(jié)的空行要求
5.多個(gè)連續(xù)的空行是允許的,但沒(méi)有必要這樣做(我們也不鼓勵(lì)這樣做)。
2.6.2 水平空白
除了語(yǔ)言需求和其它規(guī)則,并且除了文字,注釋和Javadoc用到單個(gè)空格,單個(gè)ASCII空格也出現(xiàn)在以下幾個(gè)地方:
1.分隔任何保留字與緊隨其后的左括號(hào)(()(如if, for catch等)。
2.分隔任何保留字與其前面的右大括號(hào)(})(如else, catch)。
3.在任何左大括號(hào)前({),兩個(gè)例外:
o @SomeAnnotation({a, b})(不使用空格)。
o String[][] x = foo;(大括號(hào)間沒(méi)有空格,見(jiàn)下面的Note)。
4.在任何二元或三元運(yùn)算符的兩側(cè)。這也適用于以下"類運(yùn)算符"符號(hào):
o 類型界限中的&()。
o catch塊中的管道符號(hào)(catch (FooException | BarException e)。
o foreach語(yǔ)句中的分號(hào)。
5.在, : ;及右括號(hào)())后
6.如果在一條語(yǔ)句后做注釋,則雙斜杠(//)兩邊都要空格。這里可以允許多個(gè)空格,但沒(méi)有必要。
7.類型和變量之間:List list。
8.數(shù)組初始化中,大括號(hào)內(nèi)的空格是可選的,即new int[] {5, 6}和new int[] { 5, 6 }都是可以的。
2.7 用小括號(hào)來(lái)限定組:推薦
除非作者和reviewer都認(rèn)為去掉小括號(hào)也不會(huì)使代碼被誤解,或是去掉小括號(hào)能讓代碼更易于閱讀,否則我們不應(yīng)該去掉小括號(hào)。
我們沒(méi)有理由假設(shè)讀者能記住整個(gè)Java運(yùn)算符優(yōu)先級(jí)表。
2.8 具體結(jié)構(gòu)
2.8.1 枚舉類
枚舉常量間用逗號(hào)隔開(kāi),換行可選。
沒(méi)有方法和文檔的枚舉類可寫成數(shù)組初始化的格式:
<pre>
private enum Suit {
CLUBS,
HEARTS,
SPADES,
DIAMONDS
}
</pre>
由于枚舉類也是一個(gè)類,因此所有適用于其它類的格式規(guī)則也適用于枚舉類。
2.8.2 變量聲明
2.8.2.1 每次只聲明一個(gè)變量
不要使用組合聲明,比如int a, b;。
2.8.2.2 需要時(shí)才聲明,并盡快進(jìn)行初始化
不要在一個(gè)代碼塊的開(kāi)頭把局部變量一次性都聲明了(這是c語(yǔ)言的做法),而是在第一次需要使用它時(shí)才聲明。 局部變量在聲明時(shí)最好就進(jìn)行初始化,或者聲明后盡快進(jìn)行初始化。
2.8.3 數(shù)組
2.8.3.1 數(shù)組初始化:可寫成塊狀結(jié)構(gòu)
數(shù)組初始化可以寫成塊狀結(jié)構(gòu),如下
<pre>
new int[] {
0, 1, 2, 3
}
new int[] {
0,
1,
2,
3
}
new int[] {
0, 1,
2, 3
}
new int[]
{0, 1, 2, 3}
</pre>
2.8.3.2 非c風(fēng)格的數(shù)組聲明
中括號(hào)是類型的一部分:String[] args,而非String args[]。
2.8.4 switch語(yǔ)句
術(shù)語(yǔ)說(shuō)明:switch塊的大括號(hào)內(nèi)是一個(gè)或多個(gè)語(yǔ)句組。
每個(gè)語(yǔ)句組包含一個(gè)或多個(gè)switch標(biāo)簽(case FOO:或default:),后面跟著一條或多條語(yǔ)句。
2.8.4.1 縮進(jìn)
與其它塊狀結(jié)構(gòu)一致,switch塊中的內(nèi)容縮進(jìn)為2個(gè)空格。每個(gè)switch標(biāo)簽后新起一行,再縮進(jìn)2個(gè)空格,寫下一條或多條語(yǔ)句。
2。8.4.2 Fal-through:注釋
在一個(gè)switch塊內(nèi),每個(gè)語(yǔ)句組要么通過(guò)break, continue, return或拋出異常來(lái)終止,要么通過(guò)一條注釋來(lái)說(shuō)明程序?qū)⒗^續(xù)執(zhí)行到下一個(gè)語(yǔ)句組, 任何能表達(dá)這個(gè)意思的注釋都是OK的(典型的是用// fall through)。這個(gè)特殊的注釋并不需要在最后一個(gè)語(yǔ)句組(一般是default)中出現(xiàn)。
示例:
<pre>
switch (input) {
case 1:
case 2:
prepareOneOrTwo(); // fall through
case 3:
handleOneTwoOrThree();
break;
default:
handleLargeNumber(input);
}
</pre>
2.8.4.3 default的情況要寫出來(lái)
每個(gè)switch語(yǔ)句都包含一個(gè)default語(yǔ)句組,即使它什么代碼也不包含。
2.8.5 注解
注解緊跟在文檔塊后面,應(yīng)用于類、方法和構(gòu)造函數(shù),一個(gè)注解獨(dú)占一行。這些換行不屬于自動(dòng)換行(第4.5節(jié),自動(dòng)換行),因此縮進(jìn)級(jí)別不變。
例如:
@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ù)和局部變量注解沒(méi)有特定規(guī)則。
2.8.6 注釋
2.8.6.1 塊注釋風(fēng)格
塊注釋與其周圍的代碼在同一縮進(jìn)級(jí)別。它們可以是/ ... /風(fēng)格,也可以是// ...風(fēng)格。對(duì)于多行的/ ... /注釋,后續(xù)行必須從開(kāi)始, 并且與前一行的對(duì)齊。
以下示例注釋都是OK的。
<pre>
/** This is // And so /* Or you can
- okay. // is this. * even do this. */
*/
</pre>
注釋不要封閉在由星號(hào)或其它字符繪制的框架里。
2.8.6.2 Modifier(修飾符)
類和成員的modifiers如果存在,則按Java語(yǔ)言規(guī)范中推薦的順序出現(xiàn)。
public protected private abstract static final transient volatile synchronized native strictfp
3 命名約定
3.1 對(duì)所有標(biāo)識(shí)符都通用的規(guī)則
標(biāo)識(shí)符只能使用ASCII字母和數(shù)字,因此每個(gè)有效的標(biāo)識(shí)符名稱都能匹配正則表達(dá)式。
3.2 標(biāo)志符類型的規(guī)則
3.2.1 包名
包名全部小寫,連續(xù)的單詞只是簡(jiǎn)單地連接起來(lái),不使用下劃線。
采用反域名命名規(guī)則,全部使用小寫字母。一級(jí)包名為com,二級(jí)包名為xx(可以是公司或則個(gè)人的隨便),三級(jí)包名根據(jù)應(yīng)用進(jìn)行命名,四級(jí)包名為模塊名或?qū)蛹?jí)名。
例如:com.jiashuangkuaizi.kitchen
| 包名 | 此包中包含 |
|---|---|
| com.xx.應(yīng)用名稱縮寫.activity | 頁(yè)面用到的Activity類 (activitie層級(jí)名用戶界面層) |
| com.xx.應(yīng)用名稱縮寫.base | 基礎(chǔ)共享的類 |
| com.xx.應(yīng)用名稱縮寫.adapter | 頁(yè)面用到的Adapter類 (適配器的類) |
| com.xx.應(yīng)用名稱縮寫.util | 此包中包含:公共工具方法類(util模塊名) |
| com.xx.應(yīng)用名稱縮寫.bean | 下面可分:vo、po、dto 此包中包含:JavaBean類 |
| com.xx.應(yīng)用名稱縮寫.model | 此包中包含:模型類 |
| com.xx.應(yīng)用名稱縮寫.db | 數(shù)據(jù)庫(kù)操作類 |
| com.xx.應(yīng)用名稱縮寫.view (或者 com.xx.應(yīng)用名稱縮寫.widget ) | 自定義的View類等 |
| com.xx.應(yīng)用名稱縮寫.service | Service服務(wù) |
| com.xx.應(yīng)用名稱縮寫.receiver | BroadcastReceiver服務(wù) |
注意:
如果項(xiàng)目采用MVP,所有M、V、P抽取出來(lái)的接口都放置在相應(yīng)模塊的i包下,所有的實(shí)現(xiàn)都放置在相應(yīng)模塊的impl下
3.2.2 類名
類名都以UpperCamelCase風(fēng)格編寫。
類名通常是名詞或名詞短語(yǔ),接口名稱有時(shí)可能是形容詞或形容詞短語(yǔ)?,F(xiàn)在還沒(méi)有特定的規(guī)則或行之有效的約定來(lái)命名注解類型。
名詞,采用大駝峰命名法,盡量避免縮寫,除非該縮寫是眾所周知的, 比如HTML,URL,如果類名稱中包含單詞縮寫,則單詞縮寫的每個(gè)字母均應(yīng)大寫
| 類 | 描述 | 舉例 |
|---|---|---|
| Activity 類 | Activity為后綴標(biāo)識(shí) | 歡迎頁(yè)面類WelcomeActivity |
| Adapter類 | Adapter 為后綴標(biāo)識(shí) | 新聞詳情適配器 NewDetailAdapter |
| 解析類 | Parser為后綴標(biāo)識(shí) | 首頁(yè)解析類HomePosterParser |
| 工具方法類 | Util或Manager為后綴標(biāo)識(shí)(與系統(tǒng)或第三方的Utils區(qū)分)或功能+Util | 線程池管理類:ThreadPoolManager 日志工具類:LogUtil(Logger也可) 打印工具類:PrinterUtil |
| 數(shù)據(jù)庫(kù)類 | 以DBHelper后綴標(biāo)識(shí) | 新聞數(shù)據(jù)庫(kù):NewDBHelper |
| Service類 | 以Service為后綴標(biāo)識(shí) | 時(shí)間服務(wù)TimeServiceBroadcast |
| Receiver類 | 以Receiver為后綴標(biāo)識(shí) | 推送接收J(rèn)PushReceiver |
| ContentProvider | 以Provider為后綴標(biāo)識(shí) | |
| 自定義的共享基礎(chǔ)類 | 以Base開(kāi)頭 | BaseActivity,BaseFragment |
測(cè)試類的命名以它要測(cè)試的類的名稱開(kāi)始,以Test結(jié)束。
例如:HashTest 或 HashIntegrationTest。
接口(interface):命名規(guī)則與類一樣采用大駝峰命名法,多以able或ible結(jié)尾,如
interface Runnable ;
interface Accessible。
MVP模式中分別以Presenter,View,Model結(jié)尾,遵循google的MVP模式demo構(gòu)建模式
3.2.3 方法名
方法名都以 LowerCamelCase 風(fēng)格編寫。
方法名通常是動(dòng)詞或動(dòng)詞短語(yǔ)。
| 方法 | 說(shuō)明 |
|---|---|
| initXX() | 初始化相關(guān)方法,使用init為前綴標(biāo)識(shí),如初始化布局initView() |
| isXX() checkXX() | 方法返回值為boolean型的請(qǐng)使用is或check為前綴標(biāo)識(shí) |
| getXX() | 返回某個(gè)值的方法,使用get為前綴標(biāo)識(shí) |
| handleXX() | 對(duì)數(shù)據(jù)進(jìn)行處理的方法,盡量使用handle為前綴標(biāo)識(shí) |
| displayXX()/showXX() | 彈出提示框和提示信息,使用display/show為前綴標(biāo)識(shí) |
| saveXX() | 與保存數(shù)據(jù)相關(guān)的,使用save為前綴標(biāo)識(shí) |
| resetXX() | 對(duì)數(shù)據(jù)重組的,使用reset前綴標(biāo)識(shí) |
| clearXX() | 清除數(shù)據(jù)相關(guān)的 |
| removeXXX() | 清除數(shù)據(jù)相關(guān)的 |
| drawXXX() | 繪制數(shù)據(jù)或效果相關(guān)的,使用draw前綴標(biāo)識(shí) |
下劃線可能出現(xiàn)在JUnit測(cè)試方法名稱中用以分隔名稱的邏輯組件。一個(gè)典型的模式是:test_,例如testPop_emptyStack。
并不存在唯一正確的方式來(lái)命名測(cè)試方法。
#######3.2.4 常量名
常量名命名模式為CONSTANT_CASE,全部字母大寫,用下劃線分隔單詞。那,到底什么算是一個(gè)常量?
每個(gè)常量都是一個(gè)靜態(tài)final字段,但不是所有靜態(tài)final字段都是常量。在決定一個(gè)字段是否是一個(gè)常量時(shí),考慮它是否真的感覺(jué)像是一個(gè)常量。
例如,如果任何一個(gè)該實(shí)例的觀測(cè)狀態(tài)是可變的,則它幾乎肯定不會(huì)是一個(gè)常量。只是永遠(yuǎn)不打算改變對(duì)象一般是不夠的,它要真的一直不變才能將它示為常量
<pre>
// Constants
static final int NUMBER = 5;
static final ImmutableListNAMES = 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 SetmutableCollection = new HashSet();
static final ImmutableSetmutableElements = ImmutableSet.of(mutable);
static final Logger logger = Logger.getLogger(MyClass.getName());
static final String[] nonEmptyArray = {"these", "can", "change"};
</pre>
3.2.5 非常量字段
非常量字段名以LowerCamelCase風(fēng)格的基礎(chǔ)上改造為如下風(fēng)格:
基本結(jié)構(gòu)為scopeVariableNameType,
scope:范圍
非公有,非靜態(tài)字段命名以m開(kāi)頭。
靜態(tài)字段命名以s開(kāi)頭。
公有非靜態(tài)字段命名以p開(kāi)頭。
公有靜態(tài)字段(全局變量)命名以g開(kāi)頭。
public static final 字段(常量) 全部大寫,并用下劃線連起來(lái)。
例子
<pre>
public class MyClass {
public static final int SOME_CONSTANT = 42;
public int pField;
private static MyClass sSingleton;
int mPackagePrivate;
private int mPrivate;
protected int mProtected;
public static int gField;
}
</pre>
使用1字符前綴來(lái)表示作用范圍,1個(gè)字符的前綴必須小寫,前綴后面是由表意性強(qiáng)的一個(gè)單詞或多個(gè)單詞組成的名字,而且每個(gè)單詞的首寫字母大寫,其它字母小寫,這樣保證了對(duì)變量名能夠進(jìn)行正確的斷句
Type:類型
考慮到Android中使用很多UI控件,為避免控件和普通成員變量混淆以及更好達(dá)意,所有用來(lái)表示控件的成員變量統(tǒng)一加上控件縮寫作為前綴。
對(duì)于普通變量一般不添加類型后綴,如果統(tǒng)一添加類型前綴,請(qǐng)參考下面。
用統(tǒng)一的量詞通過(guò)在結(jié)尾處放置一個(gè)量詞,就可創(chuàng)建更加統(tǒng)一的變量,它們更容易理解,也更容易搜索。
| 控件 | 縮寫 | 例子 |
|---|---|---|
| LinearLayout | ll | llFriend或者mFriendLL |
| RelativeLayout | rl | rlMessage或mMessageRL |
| FrameLayout | fl | flCart或mCartFL |
| TableLayout | tl | tlTab或mTabTL |
| Button | btn | btnHome或mHomeBtn |
| ImageButton | ibtn | btnPlay或mPlayIBtn |
| TextView | tv | tvName或mNameTV |
| EditText | et | etName或mNameET |
| etName或mNameET | lv | lvCart或mCartLV |
| ImageView | iv | ivHead或mHeadIV |
| GridView | gv | gvPhoto或mPhotoGV |
UI控件縮寫表
例如,請(qǐng)使用 mCustomerStrFirst 和 mCustomerStrLast,而不要使用mFirstCustomerStr和mLastCustomerStr。
量詞列表:量詞后綴說(shuō)明
First 一組變量中的第一個(gè)
Last 一組變量中的最后一個(gè)
Next 一組變量中的下一個(gè)變量
Prev 一組變量中的上一個(gè)
Cur 一組變量中的當(dāng)前變量。
說(shuō)明:
集合添加如下后綴:List、Map、Set
數(shù)組添加如下后綴:Arr
3.2.6 參數(shù)名
參數(shù)名以LowerCamelCase風(fēng)格編寫
3.2.7 局部變量名
局部變量名以LowerCamelCase風(fēng)格編寫,比起其它類型的名稱,局部變量名可以有更為寬松的縮寫。
雖然縮寫更寬松,但還是要避免用單字符進(jìn)行命名,除了臨時(shí)變量和循環(huán)變量。
即使局部變量是final和不可改變的,也不應(yīng)該把它示為常量,自然也不能用常量的規(guī)則去命名它。
臨時(shí)變量
臨時(shí)變量通常被取名為i,j,k,m和n,它們一般用于整型;c,d,e,它們一般用于字符型。 如: for (int i = 0; i < len ; i++),并且它和第一個(gè)單詞間沒(méi)有空格。
3.2.8 類型變量名
類型變量可用以下兩種風(fēng)格之一進(jìn)行命名
- 單個(gè)的大寫字母,后面可以跟一個(gè)數(shù)字(如:E,T,X,T2)
- 以類命名方式(5.2.2節(jié)),后面加個(gè)大寫的T(如:RequestT,FooBarT)
3.2.9 資源文件命名規(guī)范
1.1. 資源布局文件(XML文件(layout布局文件)):
全部小寫,采用下劃線命名法
- contentview 命名
必須以全部單詞小寫,單詞間以下劃線分割,使用名詞或名詞詞組。
所有Activity或Fragment的contentView必須與其類名對(duì)應(yīng),對(duì)應(yīng)規(guī)則為:
將所有字母都轉(zhuǎn)為小寫,將類型和功能調(diào)換(也就是后綴變前綴)。
例如:activity_main.xml - Dialog命名:dialog_描述.xml
例如:dialog_hint.xml - PopupWindow命名:ppw_描述.xml
例如:ppw_info.xml - 列表項(xiàng)命名:item_描述.xml
例如:item_city.xml - 包含項(xiàng)命名:模塊(位置)描述.xml
例如:activity_main_head.xml、activity_main_bottom.xml
注意:通用的包含項(xiàng)命名采用:項(xiàng)目名稱縮寫描述.xml
例如:xxxx_title.xml
- 資源文件(圖片drawable文件夾下):
全部小寫,采用下劃線命名法,加前綴區(qū)分
命名模式:可加后綴 small 表示小圖, big 表示大圖,邏輯名稱可由多個(gè)單詞加下劃線組成,采用以下規(guī)則:
用途模塊名邏輯名稱
用途模塊名顏色
用途邏輯名稱
用途顏色
說(shuō)明:用途也指控件類型(具體見(jiàn)UI控件縮寫表)
例如:
btn_main_home.png按鍵
divider_maket_white.png 分割線
ic_edit.png 圖標(biāo)
bg_main.png 背景
btn_red.png 紅色按鍵
btn_red_big.png 紅色大按鍵
ic_head_small.png 小頭像
bg_input.png輸入框背景
divider_white.png白色分割線
如果有多種形態(tài)如按鈕等除外如 btn_xx.xml(selector)
| 名稱 | 功能 |
|---|---|
| btn_xx | 按鈕圖片使用btn_整體效果(selector) |
| btn_xx_normal | 按鈕圖片使用btn_正常情況效果 |
| btn_xx_pressed | 按鈕圖片使用btn_點(diǎn)擊時(shí)候效果 |
| btn_xx_focused | state_focused聚焦效果 |
| btn_xx_disabled | state_enabled (false)不可用效果 |
| btn_xx_checked | state_checked選中效果 |
| btn_xx_selected | state_selected選中效果 |
| btn_xx_hovered | state_hovered懸停效果 |
| btn_xx_checkable | state_checkable可選效果 |
| btn_xx_activated | state_activated激活的 |
| btn_xx_windowfocused | state_window_focused |
| bg_head | 背景圖片使用bg_功能_說(shuō)明 |
| def_search_cell | 默認(rèn)圖片使用def_功能_說(shuō)明 |
| ic_more_help | 圖標(biāo)圖片使用ic_功能_說(shuō)明 |
| seg_list_line | 具有分隔特征的圖片使用seg_功能_說(shuō)明 |
| sel_ok | 選擇圖標(biāo)使用sel_功能_說(shuō)明 |
注意:
使用AndroidStudio的插件SelectorChapek可以快速生成selector,前提是命名要規(guī)范。
- 動(dòng)畫文件(anim文件夾下):
全部小寫,采用下劃線命名法,加前綴區(qū)分。
具體動(dòng)畫采用以下規(guī)則:
模塊名_邏輯名稱.
邏輯名稱.
refresh_progress.xml.
market_cart_add.xml.
market_cart_remove.xml.
普通的tween動(dòng)畫采用如下表格中的命名方式.
// 前面為動(dòng)畫的類型,后面為方向
動(dòng)畫命名例子|規(guī)范寫法
:---:|:----:
fade_in|淡入
fade_out|淡出
push_down_in|從下方推入
push_down_out|從下方推出
push_left|推向左方
slide_in_from_top|從頭部滑動(dòng)進(jìn)入
zoom_enter|變形進(jìn)入
slide_in|滑動(dòng)進(jìn)入
shrink_to_middle|中間縮小
4.values中name命名.
| 類別 | 命名 | 事例 |
|---|---|---|
| strings | strings的name命名使用下劃線命名法,采用以下規(guī)則:模塊名+邏輯名稱 | main_menu_about 主菜單按鍵文字 friend_title好友模塊標(biāo)題欄. friend_dialog_del好友刪除提示. login_check_email登錄驗(yàn)證. dialog_title 彈出框標(biāo)題 button_ok確認(rèn)鍵 loading加載文字 |
| colors | colors的name命名使用下劃線命名法,采用以下規(guī)則:模塊名+邏輯名稱 顏色 | friend_info_bgfriend_bg transparent gray |
| styles | styles的name命名使用Camel命名法,采用以下規(guī)則:模塊名+邏輯名稱 | main_tabBottom |
5.layout中的id命名
命名模式為:view縮寫_view的邏輯名稱
使用 AndroidStudio 的插件 ButterKnife Zelezny,生成注解非常方便。
如果不使用 ButterKnife Zelezny,則建議使用 view 縮寫做后綴,如: username_tv(展示用戶名的TextView)
4 編程實(shí)踐
4.1 @Override:能用則用
只要是合法的,就把@Override注解給用上。
4.2 捕獲的異常:不能忽視
除了下面的例子,對(duì)捕獲的異常不做響應(yīng)是極少正確的。(典型的響應(yīng)方式是打印日志,或者如果它被認(rèn)為是不可能的,則把它當(dāng)作一個(gè) AssertionError 重新拋出。)
如果它確實(shí)是不需要在catch塊中做任何響應(yīng),需要做注釋加以說(shuō)明(如下面的例子)。
<pre>
try {
int i = Integer.parseInt(response);
return handleNumericResponse();
} catch (NumberFormatException ok) {
// it's not numeric; that's fine, just continue
}
return handleTextResponse(response);
</pre>
例外:在測(cè)試中,如果一個(gè)捕獲的異常被命名為expected,則它可以被不加注釋地忽略。下面是一種非常常見(jiàn)的情形,用以確保所測(cè)試的方法會(huì)拋出一個(gè)期望中的異常,因此在這里就沒(méi)有必要加注釋。
<pre>
try {
emptyStack.pop();
fail();
} catch (NoSuchElementException expected) {
}
</pre>
4.3 靜態(tài)成員:使用類進(jìn)行調(diào)用
使用類名調(diào)用靜態(tài)的類成員,而不是具體某個(gè)對(duì)象或表達(dá)式
<pre>
Foo aFoo = ...;
Foo.aStaticMethod(); // good
aFoo.aStaticMethod(); // bad
somethingThatYieldsAFoo().aStaticMethod(); // very bad
</pre>
4.4 Finalizers: 禁用
極少會(huì)去重載Object.finalize
5 Javadoc
5.1 格式
5.1.1 一般形式
Javadoc塊的基本格式如下所示:
<pre>
/**
- Multiple lines of Javadoc text are written here,
- wrapped normally...
/
public int method(String p1) { ... }
</pre>
或者是以下單行形式:
<pre>
/* An especially short bit of Javadoc. */
</pre>
基本格式總是OK的。當(dāng)整個(gè)Javadoc塊能容納于一行時(shí)(且沒(méi)有Javadoc標(biāo)記@XXX),可以使用單行形式。
5.1.2 段落
空行(即,只包含最左側(cè)星號(hào)的行)會(huì)出現(xiàn)在段落之間和Javadoc標(biāo)記(@XXX)之前(如果有的話)。
除了第一個(gè)段落,每個(gè)段落第一個(gè)單詞前都有標(biāo)簽<p>,并且它和第一個(gè)單詞間沒(méi)有空格
5.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)描述無(wú)法在一行中容納,連續(xù)行需要至少再縮進(jìn)4個(gè)空格。
5.2 摘要片段
每個(gè)類或成員的Javadoc以一個(gè)簡(jiǎn)短的摘要片段開(kāi)始。這個(gè)片段是非常重要的,在某些情況下,它是唯一出現(xiàn)的文本,比如在類和方法索引中。
這只是一個(gè)小片段,可以是一個(gè)名詞短語(yǔ)或動(dòng)詞短語(yǔ),但不是一個(gè)完整的句子。它不會(huì)以A {@code Foo} is a...或This method returns...開(kāi)頭,
它也不會(huì)是一個(gè)完整的祈使句,如Save the record...。然而,由于開(kāi)頭大寫及被加了標(biāo)點(diǎn),它看起來(lái)就像是個(gè)完整的句子。
5.3 哪里需要使用Javadoc
至少在每個(gè)public類及它的每個(gè)public和protected成員處使用Javadoc,以下是一些例外:
5.3.1 例外:不言自明的方法
對(duì)于簡(jiǎn)單明顯的方法如getFoo,Javadoc是可選的(即,是可以不寫的)。這種情況下除了寫"Returns the foo",確實(shí)也沒(méi)有什么值得寫了。
單元測(cè)試類中的測(cè)試方法可能是不言自明的最常見(jiàn)例子了,我們通??梢詮倪@些方法的描述性命名中知道它是干什么的,因此不需要額外的文檔說(shuō)明。
5.3.2 例外:重載
如果一個(gè)方法重載了超類中的方法,那么Javadoc并非必需的。
5.3.3 可選的Javadoc
對(duì)于包外不可見(jiàn)的類和方法,如有需要,也是要使用Javadoc的。如果一個(gè)注釋是用來(lái)定義一個(gè)類,方法,字段的整體目的或行為,
那么這個(gè)注釋應(yīng)該寫成Javadoc,這樣更統(tǒng)一更友好。
代碼規(guī)范如上,請(qǐng)嚴(yán)格遵循以上規(guī)范,對(duì)于格式問(wèn)題,如果是使用android studio ide可遵循ide自動(dòng)格式化,命名規(guī)范請(qǐng)重點(diǎn)關(guān)注,如在項(xiàng)目中遇到未提及的點(diǎn)請(qǐng)及時(shí)補(bǔ)充