源文件規(guī)范
- 文件名:源文件名必須和它包含的頂層類名保持一致,包括大小寫,并以.java作為后綴名。
- 文件編碼:所有源文件編碼必須是
UTF-8
命名
包名
命名規(guī)則:一個(gè)唯一包名的前綴總是全部小寫的ASCII
字母并且是一個(gè)頂級(jí)域名,通常是com,edu,gov,mil,net,org
。包名的后續(xù)部分根據(jù)不同機(jī)構(gòu)各自內(nèi)部的命名規(guī)范而不盡相同。這類命名規(guī)范可能以特定目錄名的組成來(lái)區(qū)分部門(department)
, 項(xiàng)目(project)
,機(jī)器(machine)
,或注冊(cè)名(login names)
。例如:com.domain.xx
。 包命名必須以com.domain
開(kāi)始,后面跟有項(xiàng)目名稱(或者縮寫),再后面為模塊名或?qū)蛹?jí)名稱。
如:com.domain.項(xiàng)目縮寫.模塊名
com.domain.xx.bookmark
如:com.domain.項(xiàng)目縮寫.層級(jí)名
com.domain.xx.activity
類和接口命名
命名規(guī)則:類名是個(gè)一名詞,采用大小寫混合的方式,每個(gè)單詞的首字母大寫。盡量使你的類名簡(jiǎn)潔而富于描述。使用完整單詞,避免縮寫詞(除非該縮寫詞被更廣泛使用,像 URL,HTML) 接口一般要使用able
,ible
,er
等后綴。類名必須使用駝峰規(guī)則,即首字母必須大寫,如果為詞組,則每個(gè)單詞的首字母也必須要大寫,類名必須使用名詞,或名詞詞組。要求類名簡(jiǎn)單,不允許出現(xiàn)無(wú)意義的單詞。方法的命名
命名規(guī)則:方法名是一個(gè)動(dòng)詞,采用大小寫混合的方式,第一個(gè)單詞的首字母小寫,其后單詞的首字母大寫。例如:public void run(); public String getBookName();
類中常用方法的命名:
- 類的獲取方法(一般具有返回值)一般要求在被訪問(wèn)的字段名前加上
get
。如getFirstName()
,getLastName()
。一般來(lái)說(shuō),get
前綴方法返回的是單個(gè)值,find
前綴的方法返回的是列表值。- 類的設(shè)置方法(一般返回類型為void
):被訪問(wèn)字段名的前面加上前綴set
。如setFirstName()
,setLastName()
。- 類的布爾型的判斷方法一般要求方法名使用單詞is
或has
做前綴。如isPersistent()
,isString()
.或者使用具有邏輯意義的單詞,例如equal
或equals
。- 類的普通方法一般采用完整的英文描述說(shuō)明成員方法功能,第一個(gè)單詞盡可能采用動(dòng)詞,首字母小寫。如openFile()
,addCount()
。- 構(gòu)造方法應(yīng)該用遞增的方式寫,(參數(shù)多的寫在后面)。-toString()
方法:一般情況下,每個(gè)類都應(yīng)該定義toString()
.
變量命名
命名規(guī)則:第一個(gè)單詞的首字母小寫,其后單詞的首字母大寫。變量名不應(yīng)以下劃線或美元符號(hào)開(kāi)頭,盡管這在語(yǔ)法上是允許的。變量名應(yīng)簡(jiǎn)短且富于描述。變量名的選用應(yīng)該易于記憶,即,能夠指出其用途。盡量避免單個(gè)字符的變量名,除非是一次性的臨時(shí)變量。臨時(shí)變量通常被取名為i,j,k,m,n
它們一般用于整型;c,d,e
它們一般用于字符型。在Android
中成員變量,非public
非static
的變量可以使用m
開(kāi)頭,非常量的static
變量可以使用s
開(kāi)頭。變量命名也必須使用駝峰規(guī)則,但是首字母必須小寫,變量名盡可能的使用名詞或名詞詞組。同樣要求簡(jiǎn)單易懂,不允許出現(xiàn)無(wú)意義的單詞。例如:private String mBookName;
常量命名
命名規(guī)則:類常量的聲明,應(yīng)該全部大寫,單詞間用下劃線隔開(kāi)。例如:private static final int MIN_WIDTH = 4;
異常命名
自定義異常的命名必須以Exception
為結(jié)尾。已明確標(biāo)示為一個(gè)異常。layout命名
layout.xml
的命名必須以全部單詞小寫,單詞間以下劃線分割,并且使用名詞或名詞詞組,即使用 模塊名功能名稱所屬頁(yè)面類型 來(lái)命名。如:video_controller_player_activity
視頻模塊下的-控制欄-屬于播放器的-Activity頁(yè)id命名
·layout中所使用的
id必須以全部單詞小寫,單詞間以下劃線分割,并且使用名詞或名詞詞組,并且要求能夠通過(guò)
id直接理解當(dāng)前組件要實(shí)現(xiàn)的功能。如:某
TextView @+id/tv_book_name_show。如:某
EditText @+id/et_book_name_edit
。資源命名
layout
中所使用的所有資源(如drawable
,style
等),命名必須以全部單詞小寫,單詞間以下劃線分割,并且盡可能的使用名詞或名詞組, 即使用 模塊名_用途 來(lái)命名。如果為公共資源,如分割線等,則直接用用途來(lái)命名 ,如:menu_icon_navigate.png
,如:某分割線:line.png
或separator.png
。
注釋
Java
程序有兩類注釋:實(shí)現(xiàn)注釋(implementation comments)
和文檔注釋(document comments)
。
實(shí)現(xiàn)注釋是使用/.../和//界定的注釋。文檔注釋(被稱為"doc comments")由/*.../界定。文檔注釋可以通過(guò)javadoc 工具轉(zhuǎn)換成HTML 文件。
-
類注釋
每一個(gè)類都要包含如下格式的注釋,以說(shuō)明當(dāng)前類的功能等。
/**- 類名
- @author 作者
- 實(shí)現(xiàn)的主要功能。
- 創(chuàng)建日期
- 修改者,修改日期,修改內(nèi)容。
*/
-
方法注釋
每一個(gè)方法都要包含 如下格式的注釋 包括當(dāng)前方法的用途,當(dāng)前方法參數(shù)的含義,當(dāng)前方法返回值的內(nèi)容和拋出異常的列表。
/**- 方法的一句話概述
- <p>方法詳述(簡(jiǎn)單方法可不必詳述)</p>
- @param s 說(shuō)明參數(shù)含義
- @return 說(shuō)明返回值含義
- @throws IOException 說(shuō)明發(fā)生此異常的條件
- @throws NullPointerException 說(shuō)明發(fā)生此異常的條件
*/
-
類成員變量和常量注釋
成員變量和常量需要使用java doc
形式的注釋,以說(shuō)明當(dāng)前變量或常量的含義
/**- XXXX含義
*/
- XXXX含義
其他注釋
方法內(nèi)部的注釋 如果需要多行 使用/…… /形式,如果為單行是用//……形式的注釋。
不要再方法內(nèi)部使用 java doc 形式的注釋“/……*/”
代碼風(fēng)格
縮進(jìn)
除了換行符之外,ASCII空格(0x20)是唯一合法的空格字符。這意味著不允許使用Tab
進(jìn)行縮進(jìn),應(yīng)該使用空格進(jìn)行縮進(jìn),推薦縮進(jìn)為4個(gè)空格,Eclipse
中將Tab
替換為4個(gè)空格的設(shè)置方法(很多人都習(xí)慣直接按4次空格,感覺(jué)不設(shè)置習(xí)慣了也挺好)。- 代碼設(shè)置:Window->Preferences->General->Editors->Text Editors->
勾選Insert spaces for tabs``。- XML文件的Tab配置:
Window->Preferences->XML->XML Files->Editor>選擇右側(cè)區(qū)域的
Indent using spaces`空行
空行將邏輯相關(guān)的代碼段分隔開(kāi),以提高可讀性。 下列情況應(yīng)該總是使用空行:
一個(gè)源文件的兩個(gè)片段之間
類聲明和接口聲明之間
兩個(gè)方法之間
方法內(nèi)的局部變量和方法的第一條語(yǔ)句之間
-
一個(gè)方法內(nèi)的兩個(gè)邏輯段之間,用以提高可讀性
通常在 變量聲明區(qū)域之后要用空行分隔,常量聲明區(qū)域之后要有空行分隔,方法聲明之前要有空行分隔。
- 方法
- 一個(gè)方法盡量不要超過(guò)15行(可能會(huì)有難度,但是盡量不要太多,弄個(gè)方法幾千行這是絕對(duì)不允許的),如果方法太長(zhǎng),說(shuō)明當(dāng)前方法業(yè)務(wù)邏輯已經(jīng)非常復(fù)雜,
那么就需要進(jìn)行方法拆分,保證每個(gè)方法只作一件事。 - 不要使用
try catch
處理業(yè)務(wù)邏輯!!!!
-
參數(shù)和返回值
- 一個(gè)方法的參數(shù)盡可能的不要超過(guò)4個(gè)(根據(jù)情況可能也會(huì)有些難度)
- 如果一個(gè)方法返回的是一個(gè)錯(cuò)誤碼,請(qǐng)使用異常!!
- 盡可能不要使用
null
替代為異常
神秘?cái)?shù)字
代碼中不允許出現(xiàn)單獨(dú)的數(shù)字,字符!如果需要使用數(shù)字或字符,則將它們按照含義封裝為靜態(tài)常量!(for
語(yǔ)句中除外)-
控制語(yǔ)句
判斷中如有常量,則應(yīng)將常量置于判斷式的右側(cè)。如:
if (true == isAdmin())...
盡量不要使用三目條件的嵌套。在
if
、else
、for
、do
和while
語(yǔ)句中,即使沒(méi)有語(yǔ)句或者只有一行,也不得省略花括號(hào):if (true){ //do something...... }
不要使用下面的方式:
if (true) i = 0; //不要使用這種
對(duì)于循環(huán):
//將操作結(jié)構(gòu)保存在臨時(shí)變量里,減少方法調(diào)用次數(shù)final int count = products.getCount(); while(index < count){ // ... }
而不是
while(index < products.getCount()){ //每此都會(huì)執(zhí)行一次getCount()方法, //若此方法耗時(shí)則會(huì)影響執(zhí)行效率 //而且可能帶來(lái)同步問(wèn)題,若有同步需求,請(qǐng)使用同步塊或同步方法 }
訪問(wèn)控制
若沒(méi)有足夠理由,不要把實(shí)例或類變量聲明為公有。-
變量賦值
不要使用內(nèi)嵌(embedded)賦值運(yùn)算符試圖提高運(yùn)行時(shí)的效率,這是編譯器的工作。例如:
d = (a = b + c) + r;
應(yīng)該寫成a = b + c; d = a + r;
圓括號(hào)的試用
一般而言,在含有多種運(yùn)算符的表達(dá)式中使用圓括號(hào)來(lái)避免運(yùn)算符優(yōu)先級(jí)問(wèn)題,是個(gè)好方法。即使運(yùn)算符的優(yōu)先級(jí)對(duì)你而言可能很清楚,但對(duì)其他人未必如此。你不能假設(shè)別的程序員和你一樣清楚運(yùn)算符的優(yōu)先級(jí)。不要這樣寫:if (a == b && c == d)
,正確的方式為:if ((a == b) && (c == d))
-
返回值
設(shè)法讓你的程序結(jié)構(gòu)符合目的。例如:if (booleanExpression) { return true; } else { return false; }
應(yīng)該代之以如下方法:
return booleanExpression
類似地:
if (condition) { return x; } return y;
應(yīng)該寫做:
return (condition ? x : y);
條件運(yùn)算符
?
前的表達(dá)式
如果一個(gè)包含二元運(yùn)算符的表達(dá)式出現(xiàn)在三元運(yùn)算符" ? : "的"?"之前,那么應(yīng)該給表達(dá)式添上一對(duì)圓括號(hào)。例如:(x >= 0) ? x : -x
所有未使用的import語(yǔ)句應(yīng)該被刪除。
重載(Overload)方法必須放在一起
非空塊中花括號(hào)的使用
在非空代碼塊中使用花括號(hào)時(shí)要遵循K&R
風(fēng)格`(Kernighan and Ritchie Style):左花括號(hào)({)前不能換行,在其后換行。在右花括號(hào)(})前要有換行。空代碼塊中花括號(hào)的使用
如果一個(gè)代碼塊是空的,可以直接使用{}
。除了if/else-if/else
和try/catch/finally
這樣的多塊語(yǔ)句.列寬
列寬必須為120字符,以下情況可以不遵守列寬限制:無(wú)法限制寬度的內(nèi)容,比如注釋里的長(zhǎng)URL
;package
和import
語(yǔ)句;注釋中需要被粘貼到Shell
里去執(zhí)行的命令-
枚舉
用逗號(hào)分割每個(gè)枚舉變量,并且變量要單獨(dú)在一行enum Color { RED, GREEN, YELLOW }
長(zhǎng)整形數(shù)字
長(zhǎng)整型數(shù)字必須使用大寫字母L
結(jié)尾,不能使用小寫字母l
,以便和數(shù)字1進(jìn)行區(qū)分。例如使用3000000000L而不是3000000000l
開(kāi)發(fā)格式統(tǒng)一
Eclipse
Windows -> Preferences -> Java -> Code Style
然后選擇Import
導(dǎo)入相應(yīng)的Clean Up
、Code Templates
、Formatter
等XML文件。如果不需要Copyright信息,想要自定義的,可以不導(dǎo)入Code Templates。IDEA
File -> Import Settings
選擇下載鏈接中的IDEA_Style.jar
文件,可以看到兩個(gè)選項(xiàng),只需代碼風(fēng)格的,可以僅選擇Code style schemes
,如果需要默認(rèn)的Copyright
信息,選擇Default Project settings
。
代碼嚴(yán)謹(jǐn)性要求
ArrayList
通過(guò)get
方法使用下標(biāo)獲取元素,如果使用的下標(biāo)不在ArrayList
大小范圍內(nèi),將產(chǎn)生java.lang.IndexOutOfBoundsException
的異常,導(dǎo)致app
出現(xiàn)Crash
。方法中存在
return null
返回對(duì)象直接進(jìn)行方法調(diào)用隱患, 在使用時(shí)需要先判斷是否為null
,一般盡量不要在方法中直接return null
,最好用異常代替。銷毀
Dialog
前是否isShowing
未判斷隱患
調(diào)用Android.app.Dialog.cancel()
方法前,如果這個(gè)dialog
不處于showing
狀態(tài)時(shí),會(huì)拋出java.lang.IllegalArgumentException
的異常,導(dǎo)致app
出現(xiàn)Crash
。-
使用
String.split
結(jié)果未判斷長(zhǎng)度隱患
在使用String.split
得到的結(jié)果數(shù)組前,未對(duì)數(shù)組進(jìn)行長(zhǎng)度檢查,取字段的時(shí)候可能發(fā)生越界而導(dǎo)致Crash
。String source = "<br/>"; String[] infos = source.split("<br/>"); if(0 < infos.length){ String poiName = infos[0]; }