Android 編碼規(guī)范

源文件規(guī)范

  1. 文件名:源文件名必須和它包含的頂層類名保持一致脐往,包括大小寫蕊肥,并以.java作為后綴名谒获。
  2. 文件編碼:所有源文件編碼必須是UTF-8

命名

  1. 包名
    命名規(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

  2. 類和接口命名
    命名規(guī)則:類名是個一名詞精耐,采用大小寫混合的方式,每個單詞的首字母大寫琅锻。盡量使你的類名簡潔而富于描述卦停。使用完整單詞,避免縮寫詞(除非該縮寫詞被更廣泛使用恼蓬,像 URL惊完,HTML) 接口一般要使用able,ible,er等后綴。類名必須使用駝峰規(guī)則处硬,即首字母必須大寫小槐,如果為詞組,則每個單詞的首字母也必須要大寫荷辕,類名必須使用名詞凿跳,或名詞詞組。要求類名簡單疮方,不允許出現(xiàn)無意義的單詞控嗜。

  3. 方法的命名
    命名規(guī)則:方法名是一個動詞,采用大小寫混合的方式骡显,第一個單詞的首字母小寫疆栏,其后單詞的首字母大寫。例如: public void run(); public String getBookName(); 類中常用方法的命名:

  • 類的獲取方法(一般具有返回值)一般要求在被訪問的字段名前加上get惫谤。如getFirstName(),getLastName()壁顶。一般來說,get前綴方法返回的是單個值,find前綴的方法返回的是列表值。- 類的設(shè)置方法(一般返回類型為void):被訪問字段名的前面加上前綴 set溜歪。如setFirstName(),setLastName()博助。- 類的布爾型的判斷方法一般要求方法名使用單詞ishas做前綴。如isPersistent(),isString().或者使用具有邏輯意義的單詞,例如equalequals痹愚。- 類的普通方法一般采用完整的英文描述說明成員方法功能,第一個單詞盡可能采用動詞,首字母小寫富岳。如openFile(), addCount()。- 構(gòu)造方法應(yīng)該用遞增的方式寫,(參數(shù)多的寫在后面)拯腮。- toString()方法:一般情況下窖式,每個類都應(yīng)該定義toString().
  1. 變量命名
    命名規(guī)則:第一個單詞的首字母小寫,其后單詞的首字母大寫动壤。變量名不應(yīng)以下劃線或美元符號開頭萝喘,盡管這在語法上是允許的。變量名應(yīng)簡短且富于描述琼懊。變量名的選用應(yīng)該易于記憶阁簸,即,能夠指出其用途哼丈。盡量避免單個字符的變量名启妹,除非是一次性的臨時變量。臨時變量通常被取名為 i,j,k,m,n它們一般用于整型醉旦;c,d,e 它們一般用于字符型饶米。在Android中成員變量,非publicstatic的變量可以使用m開頭车胡,非常量的static變量可以使用s開頭檬输。變量命名也必須使用駝峰規(guī)則,但是首字母必須小寫匈棘,變量名盡可能的使用名詞或名詞詞組丧慈。同樣要求簡單易懂,不允許出現(xiàn)無意義的單詞主卫。例如:private String mBookName;

  2. 常量命名
    命名規(guī)則:類常量的聲明逃默,應(yīng)該全部大寫,單詞間用下劃線隔開队秩。例如:private static final int MIN_WIDTH = 4;

  3. 異常命名
    自定義異常的命名必須以Exception為結(jié)尾笑旺。已明確標(biāo)示為一個異常。

  4. layout命名
    layout.xml的命名必須以全部單詞小寫馍资,單詞間以下劃線分割筒主,并且使用名詞或名詞詞組,即使用 模塊名功能名稱所屬頁面類型 來命名鸟蟹。如:video_controller_player_activity 視頻模塊下的-控制欄-屬于播放器的-Activity頁

  5. id命名
    ·layout中所使用的id必須以全部單詞小寫乌妙,單詞間以下劃線分割,并且使用名詞或名詞詞組建钥,并且要求能夠通過id直接理解當(dāng)前組件要實現(xiàn)的功能藤韵。如:某TextView @+id/tv_book_name_show。如:某EditText @+id/et_book_name_edit熊经。

  6. 資源命名
    layout中所使用的所有資源(如drawable,style等),命名必須以全部單詞小寫泽艘,單詞間以下劃線分割欲险,并且盡可能的使用名詞或名詞組, 即使用 模塊名_用途 來命名匹涮。如果為公共資源天试,如分割線等,則直接用用途來命名 然低,如:menu_icon_navigate.png喜每,如:某分割線:line.pngseparator.png

注釋

Java程序有兩類注釋:實現(xiàn)注釋(implementation comments)和文檔注釋(document comments)雳攘。
實現(xiàn)注釋是使用/.../和//界定的注釋带兜。文檔注釋(被稱為"doc comments")由/*.../界定。文檔注釋可以通過javadoc 工具轉(zhuǎn)換成HTML 文件吨灭。

  1. 類注釋
    每一個類都要包含如下格式的注釋刚照,以說明當(dāng)前類的功能等。
    /**

    • 類名
    • @author 作者
    • 實現(xiàn)的主要功能沃于。
    • 創(chuàng)建日期
    • 修改者涩咖,修改日期,修改內(nèi)容繁莹。
      */
  2. 方法注釋
    每一個方法都要包含 如下格式的注釋 包括當(dāng)前方法的用途檩互,當(dāng)前方法參數(shù)的含義,當(dāng)前方法返回值的內(nèi)容和拋出異常的列表咨演。
    /**

    • 方法的一句話概述
    • <p>方法詳述(簡單方法可不必詳述)</p>
    • @param s 說明參數(shù)含義
    • @return 說明返回值含義
    • @throws IOException 說明發(fā)生此異常的條件
    • @throws NullPointerException 說明發(fā)生此異常的條件
      */
  3. 類成員變量和常量注釋
    成員變量和常量需要使用java doc形式的注釋闸昨,以說明當(dāng)前變量或常量的含義
    /**

    • XXXX含義
      */
  4. 其他注釋
    方法內(nèi)部的注釋 如果需要多行 使用/…… /形式,如果為單行是用//……形式的注釋薄风。
    不要再方法內(nèi)部使用 java doc 形式的注釋“/
    ……*/”

代碼風(fēng)格

  1. 縮進(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`

  2. 空行
    空行將邏輯相關(guān)的代碼段分隔開困肩,以提高可讀性划纽。 下列情況應(yīng)該總是使用空行:

  • 一個源文件的兩個片段之間

  • 類聲明和接口聲明之間

  • 兩個方法之間

  • 方法內(nèi)的局部變量和方法的第一條語句之間

  • 一個方法內(nèi)的兩個邏輯段之間,用以提高可讀性

    通常在 變量聲明區(qū)域之后要用空行分隔锌畸,常量聲明區(qū)域之后要有空行分隔勇劣,方法聲明之前要有空行分隔。

  1. 方法
  • 一個方法盡量不要超過15行(可能會有難度潭枣,但是盡量不要太多比默,弄個方法幾千行這是絕對不允許的)幻捏,如果方法太長,說明當(dāng)前方法業(yè)務(wù)邏輯已經(jīng)非常復(fù)雜退敦,
    那么就需要進(jìn)行方法拆分粘咖,保證每個方法只作一件事。
  • 不要使用try catch處理業(yè)務(wù)邏輯3薨佟!:舱 钝域!
  1. 參數(shù)和返回值

    • 一個方法的參數(shù)盡可能的不要超過4個(根據(jù)情況可能也會有些難度)
    • 如果一個方法返回的是一個錯誤碼,請使用異常6А例证!
    • 盡可能不要使用null替代為異常
  2. 神秘數(shù)字
    代碼中不允許出現(xiàn)單獨的數(shù)字,字符迷捧!如果需要使用數(shù)字或字符织咧,則將它們按照含義封裝為靜態(tài)常量!(for語句中除外)

  3. 控制語句
    判斷中如有常量,則應(yīng)將常量置于判斷式的右側(cè)漠秋。如:
    if (true == isAdmin())...
    盡量不要使用三目條件的嵌套笙蒙。

    ifelse庆锦、for捅位、dowhile語句中,即使沒有語句或者只有一行搂抒,也不得省略花括號:

    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í)行效率
        //而且可能帶來同步問題求晶,若有同步需求焰雕,請使用同步塊或同步方法
    }
    
  1. 訪問控制
    若沒有足夠理由,不要把實例或類變量聲明為公有芳杏。

  2. 變量賦值
    不要使用內(nèi)嵌(embedded)賦值運算符試圖提高運行時的效率矩屁,這是編譯器的工作。例如:
    d = (a = b + c) + r;
    應(yīng)該寫成

    a = b + c; 
    d = a + r; 
    
  3. 圓括號的試用
    一般而言蚜锨,在含有多種運算符的表達(dá)式中使用圓括號來避免運算符優(yōu)先級問題档插,是個好方法。即使運算符的優(yōu)先級對你而言可能很清楚亚再,但對其他人未必如此郭膛。你不能假設(shè)別的程序員和你一樣清楚運算符的優(yōu)先級。不要這樣寫:if (a == b && c == d)氛悬,正確的方式為:if ((a == b) && (c == d))

  4. 返回值
    設(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);

  5. 條件運算符?前的表達(dá)式
    如果一個包含二元運算符的表達(dá)式出現(xiàn)在三元運算符" ? : "的"?"之前耘柱,那么應(yīng)該給表達(dá)式添上一對圓括號。例如: (x >= 0) ? x : -x

  6. 所有未使用的import語句應(yīng)該被刪除棍现。

  7. 重載(Overload)方法必須放在一起

  8. 非空塊中花括號的使用
    在非空代碼塊中使用花括號時要遵循K&R風(fēng)格`(Kernighan and Ritchie Style):左花括號({)前不能換行调煎,在其后換行。在右花括號(})前要有換行己肮。

  9. 空代碼塊中花括號的使用
    如果一個代碼塊是空的士袄,可以直接使用{}。除了if/else-if/elsetry/catch/finally這樣的多塊語句.

  10. 列寬
    列寬必須為120字符谎僻,以下情況可以不遵守列寬限制:無法限制寬度的內(nèi)容娄柳,比如注釋里的長URLpackageimport語句艘绍;注釋中需要被粘貼到Shell里去執(zhí)行的命令

  11. 枚舉
    用逗號分割每個枚舉變量赤拒,并且變量要單獨在一行

    enum Color {
        RED,
        GREEN,
        YELLOW
    }
    
  12. 長整形數(shù)字
    長整型數(shù)字必須使用大寫字母L結(jié)尾,不能使用小寫字母l诱鞠,以便和數(shù)字1進(jìn)行區(qū)分挎挖。例如使用3000000000L而不是3000000000l

開發(fā)格式統(tǒng)一

  1. Eclipse
    Windows -> Preferences -> Java -> Code Style
    然后選擇Import導(dǎo)入相應(yīng)的Clean UpCode Templates航夺、Formatter等XML文件蕉朵。如果不需要Copyright信息,想要自定義的敷存,可以不導(dǎo)入Code Templates墓造。

  2. IDEA
    File -> Import Settings選擇下載鏈接中的IDEA_Style.jar文件,可以看到兩個選項锚烦,只需代碼風(fēng)格的觅闽,可以僅選擇Code style schemes,如果需要默認(rèn)的Copyright信息,選擇Default Project settings涮俄。

代碼嚴(yán)謹(jǐn)性要求

  1. ArrayList通過get方法使用下標(biāo)獲取元素蛉拙,如果使用的下標(biāo)不在ArrayList大小范圍內(nèi),將產(chǎn)生java.lang.IndexOutOfBoundsException的異常彻亲,導(dǎo)致app出現(xiàn)Crash孕锄。

  2. 方法中存在return null返回對象直接進(jìn)行方法調(diào)用隱患, 在使用時需要先判斷是否為null,一般盡量不要在方法中直接return null苞尝,最好用異常代替畸肆。

  3. 銷毀Dialog前是否isShowing未判斷隱患
    調(diào)用Android.app.Dialog.cancel()方法前,如果這個dialog不處于showing狀態(tài)時宙址,會拋出java.lang.IllegalArgumentException的異常轴脐,導(dǎo)致app出現(xiàn)Crash

  4. 使用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];
    }
    

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市碴巾,隨后出現(xiàn)的幾起案子溯捆,更是在濱河造成了極大的恐慌,老刑警劉巖厦瓢,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件提揍,死亡現(xiàn)場離奇詭異,居然都是意外死亡旷痕,警方通過查閱死者的電腦和手機碳锈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來欺抗,“玉大人,你說我怎么就攤上這事强重〗食剩” “怎么了?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵间景,是天一觀的道長佃声。 經(jīng)常有香客問我,道長倘要,這世上最難降的妖魔是什么圾亏? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮封拧,結(jié)果婚禮上志鹃,老公的妹妹穿的比我還像新娘。我一直安慰自己泽西,他們只是感情好曹铃,可當(dāng)我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著捧杉,像睡著了一般陕见。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上味抖,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天评甜,我揣著相機與錄音,去河邊找鬼仔涩。 笑死忍坷,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播承匣,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼蓖乘,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了韧骗?” 一聲冷哼從身側(cè)響起嘉抒,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎袍暴,沒想到半個月后些侍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年辑莫,在試婚紗的時候發(fā)現(xiàn)自己被綠了菩鲜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡耗式,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出趁猴,到底是詐尸還是另有隱情刊咳,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布儡司,位于F島的核電站娱挨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏捕犬。R本人自食惡果不足惜跷坝,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望碉碉。 院中可真熱鬧柴钻,春花似錦、人聲如沸誉裆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽足丢。三九已至粱腻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間斩跌,已是汗流浹背绍些。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留耀鸦,地道東北人柬批。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓啸澡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親氮帐。 傳聞我的和親對象是個殘疾皇子嗅虏,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內(nèi)容

  • Android編碼規(guī)范 源文件基礎(chǔ) 文件名 源文件以其最頂層的類名來命名,大小寫敏感上沐,文件擴展名為.java皮服。 文...
    呼呼哥閱讀 952評論 0 0
  • 作者:李旺成 時間:2016年4月3日 1. 前言 這份文檔參考了 Google Java 編程風(fēng)格規(guī)范和 Goo...
    diygreen閱讀 39,930評論 19 224
  • Android 編碼規(guī)范 1. 前言 這份文檔是 Google Java Code Style 的譯文,并稍有添加...
    人失憶閱讀 446評論 0 3
  • 參考文章:http://keeganlee.me/post/android/20150709 http://www...
    yangzming閱讀 938評論 0 0
  • androidstudio集成checkstyle提交前校驗方法参咙,將pre-commit文件copy到工程目錄.g...
    Chris鍋閱讀 910評論 0 0