源文件規(guī)范
- 文件名:源文件名必須和它包含的頂層類名保持一致脐往,包括大小寫蕊肥,并以.java作為后綴名谒获。
- 文件編碼:所有源文件編碼必須是
UTF-8
命名
包名
命名規(guī)則:一個唯一包名的前綴總是全部小寫的ASCII
字母并且是一個頂級域名,通常是com,edu,gov,mil,net,org
。包名的后續(xù)部分根據(jù)不同機構(gòu)各自內(nèi)部的命名規(guī)范而不盡相同晴埂。這類命名規(guī)范可能以特定目錄名的組成來區(qū)分部門(department)
, 項目(project)
,機器(machine)
,或注冊名(login names)
究反。例如:com.domain.xx
。 包命名必須以com.domain
開始,后面跟有項目名稱(或者縮寫),再后面為模塊名或?qū)蛹壝Q儒洛。
如:com.domain.項目縮寫.模塊名
com.domain.xx.bookmark
如:com.domain.項目縮寫.層級名
com.domain.xx.activity
類和接口命名
命名規(guī)則:類名是個一名詞精耐,采用大小寫混合的方式,每個單詞的首字母大寫琅锻。盡量使你的類名簡潔而富于描述卦停。使用完整單詞,避免縮寫詞(除非該縮寫詞被更廣泛使用恼蓬,像 URL惊完,HTML) 接口一般要使用able
,ible
,er
等后綴。類名必須使用駝峰規(guī)則处硬,即首字母必須大寫小槐,如果為詞組,則每個單詞的首字母也必須要大寫荷辕,類名必須使用名詞凿跳,或名詞詞組。要求類名簡單疮方,不允許出現(xiàn)無意義的單詞控嗜。方法的命名
命名規(guī)則:方法名是一個動詞,采用大小寫混合的方式骡显,第一個單詞的首字母小寫疆栏,其后單詞的首字母大寫。例如:public void run(); public String getBookName();
類中常用方法的命名:
- 類的獲取方法(一般具有返回值)一般要求在被訪問的字段名前加上
get
惫谤。如getFirstName()
,getLastName()
壁顶。一般來說,get
前綴方法返回的是單個值,find
前綴的方法返回的是列表值。- 類的設(shè)置方法(一般返回類型為void
):被訪問字段名的前面加上前綴set
溜歪。如setFirstName()
,setLastName()
博助。- 類的布爾型的判斷方法一般要求方法名使用單詞is
或has
做前綴。如isPersistent()
,isString()
.或者使用具有邏輯意義的單詞,例如equal
或equals
痹愚。- 類的普通方法一般采用完整的英文描述說明成員方法功能,第一個單詞盡可能采用動詞,首字母小寫富岳。如openFile()
,addCount()
。- 構(gòu)造方法應(yīng)該用遞增的方式寫,(參數(shù)多的寫在后面)拯腮。-toString()
方法:一般情況下窖式,每個類都應(yīng)該定義toString()
.
變量命名
命名規(guī)則:第一個單詞的首字母小寫,其后單詞的首字母大寫动壤。變量名不應(yīng)以下劃線或美元符號開頭萝喘,盡管這在語法上是允許的。變量名應(yīng)簡短且富于描述琼懊。變量名的選用應(yīng)該易于記憶阁簸,即,能夠指出其用途哼丈。盡量避免單個字符的變量名启妹,除非是一次性的臨時變量。臨時變量通常被取名為i,j,k,m,n
它們一般用于整型醉旦;c,d,e
它們一般用于字符型饶米。在Android
中成員變量,非public
非static
的變量可以使用m
開頭车胡,非常量的static
變量可以使用s
開頭檬输。變量命名也必須使用駝峰規(guī)則,但是首字母必須小寫匈棘,變量名盡可能的使用名詞或名詞詞組丧慈。同樣要求簡單易懂,不允許出現(xiàn)無意義的單詞主卫。例如:private String mBookName;
常量命名
命名規(guī)則:類常量的聲明逃默,應(yīng)該全部大寫,單詞間用下劃線隔開队秩。例如:private static final int MIN_WIDTH = 4;
異常命名
自定義異常的命名必須以Exception
為結(jié)尾笑旺。已明確標(biāo)示為一個異常。layout命名
layout.xml
的命名必須以全部單詞小寫馍资,單詞間以下劃線分割筒主,并且使用名詞或名詞詞組,即使用 模塊名功能名稱所屬頁面類型 來命名鸟蟹。如:video_controller_player_activity
視頻模塊下的-控制欄-屬于播放器的-Activity頁id命名
·layout中所使用的
id必須以全部單詞小寫乌妙,單詞間以下劃線分割,并且使用名詞或名詞詞組建钥,并且要求能夠通過
id直接理解當(dāng)前組件要實現(xiàn)的功能藤韵。如:某
TextView @+id/tv_book_name_show。如:某
EditText @+id/et_book_name_edit
熊经。資源命名
layout
中所使用的所有資源(如drawable
,style
等),命名必須以全部單詞小寫泽艘,單詞間以下劃線分割欲险,并且盡可能的使用名詞或名詞組, 即使用 模塊名_用途 來命名匹涮。如果為公共資源天试,如分割線等,則直接用用途來命名 然低,如:menu_icon_navigate.png
喜每,如:某分割線:line.png
或separator.png
。
注釋
Java
程序有兩類注釋:實現(xiàn)注釋(implementation comments)
和文檔注釋(document comments)
雳攘。
實現(xiàn)注釋是使用/.../和//界定的注釋带兜。文檔注釋(被稱為"doc comments")由/*.../界定。文檔注釋可以通過javadoc 工具轉(zhuǎn)換成HTML 文件吨灭。
-
類注釋
每一個類都要包含如下格式的注釋刚照,以說明當(dāng)前類的功能等。
/**- 類名
- @author 作者
- 實現(xiàn)的主要功能沃于。
- 創(chuàng)建日期
- 修改者涩咖,修改日期,修改內(nèi)容繁莹。
*/
-
方法注釋
每一個方法都要包含 如下格式的注釋 包括當(dāng)前方法的用途檩互,當(dāng)前方法參數(shù)的含義,當(dāng)前方法返回值的內(nèi)容和拋出異常的列表咨演。
/**- 方法的一句話概述
- <p>方法詳述(簡單方法可不必詳述)</p>
- @param s 說明參數(shù)含義
- @return 說明返回值含義
- @throws IOException 說明發(fā)生此異常的條件
- @throws NullPointerException 說明發(fā)生此異常的條件
*/
-
類成員變量和常量注釋
成員變量和常量需要使用java doc
形式的注釋闸昨,以說明當(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個空格,Eclipse
中將Tab
替換為4個空格的設(shè)置方法(很多人都習(xí)慣直接按4次空格撇他,感覺不設(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)的代碼段分隔開困肩,以提高可讀性划纽。 下列情況應(yīng)該總是使用空行:
一個源文件的兩個片段之間
類聲明和接口聲明之間
兩個方法之間
方法內(nèi)的局部變量和方法的第一條語句之間
-
一個方法內(nèi)的兩個邏輯段之間,用以提高可讀性
通常在 變量聲明區(qū)域之后要用空行分隔锌畸,常量聲明區(qū)域之后要有空行分隔勇劣,方法聲明之前要有空行分隔。
- 方法
- 一個方法盡量不要超過15行(可能會有難度潭枣,但是盡量不要太多比默,弄個方法幾千行這是絕對不允許的)幻捏,如果方法太長,說明當(dāng)前方法業(yè)務(wù)邏輯已經(jīng)非常復(fù)雜退敦,
那么就需要進(jìn)行方法拆分粘咖,保證每個方法只作一件事。 - 不要使用
try catch
處理業(yè)務(wù)邏輯3薨佟!:舱 钝域!
-
參數(shù)和返回值
- 一個方法的參數(shù)盡可能的不要超過4個(根據(jù)情況可能也會有些難度)
- 如果一個方法返回的是一個錯誤碼,請使用異常6А例证!
- 盡可能不要使用
null
替代為異常
神秘數(shù)字
代碼中不允許出現(xiàn)單獨的數(shù)字,字符迷捧!如果需要使用數(shù)字或字符织咧,則將它們按照含義封裝為靜態(tài)常量!(for
語句中除外)-
控制語句
判斷中如有常量,則應(yīng)將常量置于判斷式的右側(cè)漠秋。如:
if (true == isAdmin())...
盡量不要使用三目條件的嵌套笙蒙。在
if
、else
庆锦、for
捅位、do
和while
語句中,即使沒有語句或者只有一行搂抒,也不得省略花括號:if (true){ //do something...... }
不要使用下面的方式:
if (true) i = 0; //不要使用這種
對于循環(huán):
//將操作結(jié)構(gòu)保存在臨時變量里艇搀,減少方法調(diào)用次數(shù)final int count = products.getCount(); while(index < count){ // ... }
而不是
while(index < products.getCount()){ //每此都會執(zhí)行一次getCount()方法, //若此方法耗時則會影響執(zhí)行效率 //而且可能帶來同步問題求晶,若有同步需求焰雕,請使用同步塊或同步方法 }
訪問控制
若沒有足夠理由,不要把實例或類變量聲明為公有芳杏。-
變量賦值
不要使用內(nèi)嵌(embedded)賦值運算符試圖提高運行時的效率矩屁,這是編譯器的工作。例如:
d = (a = b + c) + r;
應(yīng)該寫成a = b + c; d = a + r;
圓括號的試用
一般而言蚜锨,在含有多種運算符的表達(dá)式中使用圓括號來避免運算符優(yōu)先級問題档插,是個好方法。即使運算符的優(yōu)先級對你而言可能很清楚亚再,但對其他人未必如此郭膛。你不能假設(shè)別的程序員和你一樣清楚運算符的優(yōu)先級。不要這樣寫: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);
條件運算符
?
前的表達(dá)式
如果一個包含二元運算符的表達(dá)式出現(xiàn)在三元運算符" ? : "的"?"之前耘柱,那么應(yīng)該給表達(dá)式添上一對圓括號。例如:(x >= 0) ? x : -x
所有未使用的import語句應(yīng)該被刪除棍现。
重載(Overload)方法必須放在一起
非空塊中花括號的使用
在非空代碼塊中使用花括號時要遵循K&R
風(fēng)格`(Kernighan and Ritchie Style):左花括號({)前不能換行调煎,在其后換行。在右花括號(})前要有換行己肮。空代碼塊中花括號的使用
如果一個代碼塊是空的士袄,可以直接使用{}
。除了if/else-if/else
和try/catch/finally
這樣的多塊語句.列寬
列寬必須為120字符谎僻,以下情況可以不遵守列寬限制:無法限制寬度的內(nèi)容娄柳,比如注釋里的長URL
;package
和import
語句艘绍;注釋中需要被粘貼到Shell
里去執(zhí)行的命令-
枚舉
用逗號分割每個枚舉變量赤拒,并且變量要單獨在一行enum Color { RED, GREEN, YELLOW }
長整形數(shù)字
長整型數(shù)字必須使用大寫字母L
結(jié)尾,不能使用小寫字母l
诱鞠,以便和數(shù)字1進(jìn)行區(qū)分挎挖。例如使用3000000000L而不是3000000000l
開發(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
文件,可以看到兩個選項锚烦,只需代碼風(fēng)格的觅闽,可以僅選擇Code style schemes
,如果需要默認(rèn)的Copyright
信息,選擇Default Project settings
涮俄。
代碼嚴(yán)謹(jǐn)性要求
ArrayList
通過get
方法使用下標(biāo)獲取元素蛉拙,如果使用的下標(biāo)不在ArrayList
大小范圍內(nèi),將產(chǎn)生java.lang.IndexOutOfBoundsException
的異常彻亲,導(dǎo)致app
出現(xiàn)Crash
孕锄。方法中存在
return null
返回對象直接進(jìn)行方法調(diào)用隱患, 在使用時需要先判斷是否為null
,一般盡量不要在方法中直接return null
苞尝,最好用異常代替畸肆。銷毀
Dialog
前是否isShowing
未判斷隱患
調(diào)用Android.app.Dialog.cancel()
方法前,如果這個dialog
不處于showing
狀態(tài)時宙址,會拋出java.lang.IllegalArgumentException
的異常轴脐,導(dǎo)致app
出現(xiàn)Crash
。-
使用
String.split
結(jié)果未判斷長度隱患
在使用String.split
得到的結(jié)果數(shù)組前,未對數(shù)組進(jìn)行長度檢查大咱,取字段的時候可能發(fā)生越界而導(dǎo)致Crash
恬涧。String source = "<br/>"; String[] infos = source.split("<br/>"); if(0 < infos.length){ String poiName = infos[0]; }