Android 編碼規(guī)范

源文件規(guī)范

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

命名

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

  2. 類和接口命名
    命名規(guī)則:類名是個(gè)一名詞,采用大小寫混合的方式,每個(gè)單詞的首字母大寫。盡量使你的類名簡(jiǎn)潔而富于描述。使用完整單詞,避免縮寫詞(除非該縮寫詞被更廣泛使用,像 URL,HTML) 接口一般要使用able,ible,er等后綴。類名必須使用駝峰規(guī)則,即首字母必須大寫,如果為詞組,則每個(gè)單詞的首字母也必須要大寫,類名必須使用名詞,或名詞詞組。要求類名簡(jiǎn)單,不允許出現(xiàn)無(wú)意義的單詞。

  3. 方法的命名
    命名規(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()。- 類的布爾型的判斷方法一般要求方法名使用單詞ishas做前綴。如isPersistent(),isString().或者使用具有邏輯意義的單詞,例如equalequals。- 類的普通方法一般采用完整的英文描述說(shuō)明成員方法功能,第一個(gè)單詞盡可能采用動(dòng)詞,首字母小寫。如openFile(), addCount()。- 構(gòu)造方法應(yīng)該用遞增的方式寫,(參數(shù)多的寫在后面)。- toString()方法:一般情況下,每個(gè)類都應(yīng)該定義toString().
  1. 變量命名
    命名規(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中成員變量,非publicstatic的變量可以使用m開(kāi)頭,非常量的static變量可以使用s開(kāi)頭。變量命名也必須使用駝峰規(guī)則,但是首字母必須小寫,變量名盡可能的使用名詞或名詞詞組。同樣要求簡(jiǎn)單易懂,不允許出現(xiàn)無(wú)意義的單詞。例如:private String mBookName;

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

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

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

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

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

注釋

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

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

    • 類名
    • @author 作者
    • 實(shí)現(xiàn)的主要功能。
    • 創(chuàng)建日期
    • 修改者,修改日期,修改內(nèi)容。
      */
  2. 方法注釋
    每一個(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ā)生此異常的條件
      */
  3. 類成員變量和常量注釋
    成員變量和常量需要使用java doc形式的注釋,以說(shuō)明當(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個(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`

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

  • 一個(gè)源文件的兩個(gè)片段之間

  • 類聲明和接口聲明之間

  • 兩個(gè)方法之間

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

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

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

  1. 方法
  • 一個(gè)方法盡量不要超過(guò)15行(可能會(huì)有難度,但是盡量不要太多,弄個(gè)方法幾千行這是絕對(duì)不允許的),如果方法太長(zhǎng),說(shuō)明當(dāng)前方法業(yè)務(wù)邏輯已經(jīng)非常復(fù)雜,
    那么就需要進(jìn)行方法拆分,保證每個(gè)方法只作一件事。
  • 不要使用try catch處理業(yè)務(wù)邏輯!!!!
  1. 參數(shù)和返回值

    • 一個(gè)方法的參數(shù)盡可能的不要超過(guò)4個(gè)(根據(jù)情況可能也會(huì)有些難度)
    • 如果一個(gè)方法返回的是一個(gè)錯(cuò)誤碼,請(qǐng)使用異常!!
    • 盡可能不要使用null替代為異常
  2. 神秘?cái)?shù)字
    代碼中不允許出現(xiàn)單獨(dú)的數(shù)字,字符!如果需要使用數(shù)字或字符,則將它們按照含義封裝為靜態(tài)常量!(for語(yǔ)句中除外)

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

    ifelsefordowhile語(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)使用同步塊或同步方法
    }
    
  1. 訪問(wèn)控制
    若沒(méi)有足夠理由,不要把實(shí)例或類變量聲明為公有。

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

    a = b + c; 
    d = a + r; 
    
  3. 圓括號(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))

  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. 條件運(yùn)算符?前的表達(dá)式
    如果一個(gè)包含二元運(yùn)算符的表達(dá)式出現(xiàn)在三元運(yùn)算符" ? : "的"?"之前,那么應(yīng)該給表達(dá)式添上一對(duì)圓括號(hào)。例如: (x >= 0) ? x : -x

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

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

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

  9. 空代碼塊中花括號(hào)的使用
    如果一個(gè)代碼塊是空的,可以直接使用{}。除了if/else-if/elsetry/catch/finally這樣的多塊語(yǔ)句.

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

  11. 枚舉
    用逗號(hào)分割每個(gè)枚舉變量,并且變量要單獨(dú)在一行

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

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

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

  2. 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)性要求

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

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

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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