android規(guī)范文檔

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布局文件)):
全部小寫,采用下劃線命名法

  1. contentview 命名
    必須以全部單詞小寫,單詞間以下劃線分割,使用名詞或名詞詞組。
    所有Activity或Fragment的contentView必須與其類名對(duì)應(yīng),對(duì)應(yīng)規(guī)則為:
    將所有字母都轉(zhuǎn)為小寫,將類型和功能調(diào)換(也就是后綴變前綴)。
    例如:activity_main.xml
  2. Dialog命名:dialog_描述.xml
    例如:dialog_hint.xml
  3. PopupWindow命名:ppw_描述.xml
    例如:ppw_info.xml
  4. 列表項(xiàng)命名:item_描述.xml
    例如:item_city.xml
  5. 包含項(xiàng)命名:模塊(位置)描述.xml
    例如:activity_main_head.xml、activity_main_bottom.xml
    注意:通用的包含項(xiàng)命名采用:項(xiàng)目名稱縮寫
    描述.xml
    例如:xxxx_title.xml
  1. 資源文件(圖片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ī)范。

  1. 動(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ǔ)充

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 作者:李旺成 時(shí)間:2016年4月3日 1. 前言 這份文檔參考了 Google Java 編程風(fēng)格規(guī)范和 Goo...
    diygreen閱讀 40,236評(píng)論 19 224
  • Android編碼規(guī)范 源文件基礎(chǔ) 文件名 源文件以其最頂層的類名來(lái)命名,大小寫敏感,文件擴(kuò)展名為.java。 文...
    呼呼哥閱讀 1,119評(píng)論 0 0
  • 1.Resource文件 命名 遵循前綴表明類型的習(xí)慣,形如type_foo_bar.xml。如:fragment...
    Rave_Tian閱讀 4,519評(píng)論 0 1
  • Android 編碼規(guī)范 1. 前言 這份文檔是 Google Java Code Style 的譯文,并稍有添加...
    人失憶閱讀 497評(píng)論 0 3
  • [TOC] 前言 這份文檔是Google Java編程風(fēng)格規(guī)范的完整定義。當(dāng)且僅當(dāng)一個(gè)Java源文件符合此文檔中的...
    marine8888閱讀 2,012評(píng)論 0 1

友情鏈接更多精彩內(nèi)容