Amdroid代碼規範

Android 代碼規範


文件結構

  1. 【強制】 源文件應以其最頂層的類名來命名,區分大小寫,文件擴展名爲.java[1]

  2. 【強制】 一個源文件應包含[1]

    說明:按順序,每個部分之間用一個空行隔開。

    • 許可證或版權信息(如有需要);

    • package語句;

    • import語句;

    • 一個頂級類(僅有一個).

  3. 【強制】 許可證和版權信息應放在文件的最前面[1]

    規範1-3正確示例

    /**
     * Copyright (C),2002-2018, 蘇寧軟件技術有限公司
     *  Author:   邊濤 
     *  Date:     2018年7月15日 下午2:16:23
     *  Description: 測試文件
     */
    
    package com.bt.hub.myhub;
    
    import android.app.Activity;
    import android.os.Bundle;
    
    public class TestActivity extends Activity{
    	...
    }
    
    
  4. 【強制】 package語句應寫在一行不換行,列限制不適用於package語句[1]

  5. . 【強制】 import語句應寫在一行不換行,列限制不適用於import語句[1]

  6. 【強制】 import語句不使用通配符[1]

    規範4-6示例

    // 反例
    import com.bt.hub.myhub.
    	Carousel.adapter.CarouselAdapter;
    import com.bt.hub.myhub.
    	Carousel.view.CarouselView;
    import com.bt.hub.myhub.R;
    
    import java.util.*;
    
    // 正例
    import com.bt.hub.myhub.Carousel.adapter.CarouselAdapter;
    import com.bt.hub.myhub.Carousel.view.CarouselView;
    import com.bt.hub.myhub.R;
    
    import java.util.ArrayList;
    import java.util.List;
    
    
  7. 【強制】 import語句可以分爲以下幾組[1]

    說明:按順序,每個部分之間用一個空行隔開,所有的靜態導入獨立成組,每個頂級包爲一組,組內不空行,按字典序排列。

    • com.google的包(僅當這個源文件是在com.google包下);
    • 第三方的包,例如:android / com / junit / org / sun / suning;
    • java / javax的包。

    規範正確示例

    // 包名
    package com.suning.mobile.epa.zxing.encoding;
    
    // com.google的包
    import com.google.zxing.BarcodeFormat;
    import com.google.zxing.EncodeHintType;
    import com.google.zxing.MultiFormatWriter;
    import com.google.zxing.WriterException;
    import com.google.zxing.common.BitMatrix;
    // android包
    import android.graphics.Bitmap;
    // java包
    import java.util.Hashtable;
    import java.util.ArrayList;
    
    
  8. 【強制】 類聲明每個頂級類都在一個與它同名的源文件中(當然,還包含.java後綴)[1]

  9. 【強制】 每個類應該以某種邏輯去排序它的成員,維護者應該要能解釋這種排序邏輯[1]

    說明:類的成員順序對程序易讀性有很大的影響,但這也不存在唯一的通用法則。不同的類對成員的排序可能是不同的。新的成員不能總是習慣性地依次添加到前者後面,因爲這樣就是按時間順序而非某種邏輯來排序的。

  10. 【強制】 建議使用註釋將源文件分爲明顯的區塊,區塊劃分如下:

    說明:對源文件進行分區,可以方便快捷的進行代碼定位,提高閱讀效率。

    • 內部接口聲明區;
    • 常量聲明區;
    • UI 控件成員變量聲明區;
    • 普通成員變量聲明區;
    • 接口實現區;
    • 控件響應事件實現區;
    • 構造方法區;
    • 初始化相關方法區;
    • 普通邏輯方法區;
    • 重載邏輯方法區;
    • 發起異步任務方法區;
    • 異步任務回調方法區;
    • 生命週期回調方法區;
    • get/set方法區;
    • 內部類聲明區。
  11. 【強制】 類成員組織通用規則[1]

    • 按照發生的先後順序排列;
    • 常量按照使用先後排列;
    • UI 控件成員變量按照layout 佈局文件的先後順序排列;
    • 通成員變量按照使用的先後順序排列;
    • 方法按照調用的先後順序,在各自區塊中排列;
    • 相關功能作爲小區塊放在一起(或者封裝掉)。
  12. 【強制】 重載永不分離[1]

    說明:當一個類有多個構造函數,或是多個同名方法,這些函數/方法應該按順序出現在一起,中間不要放進其它函數/方法。

    規範9-12正確示例:

    public class CarouselMainActivity extends Activity implements View.OnClickListener {
    	/*
    	 * 常量
    	 * /
    	private static final String TAG = "CarouselMainActivity";
    	
    	/*
     	 * UI變量
    	 * /
    	private CarouselView mCarouselView;
    	private CarouselAdapter mCarouselAdapter;
    
    	/*
    	 * 普通
    	 * /
    	private List<Page> mModel = new ArrayList<>();
    	
    	/*
    	 * 生命週期
    	 * /
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.carousel_main_layout);
    		initView();
    		initData(4);
    	}
    
        @Override
        protected void onResume() {...}
        
        /*
    	 * 自定義方法
    	 * /
    	private void initView() {...}
    
    	private void initData(int num) {...}
    	
    	/*
    	 * 接口實現
    	 * /
        @Override
        public void onClick(View v) {...}
        
        /*
    	 * 內部類
    	 * /
    	public class Page {...}
    }
    
    

命名風格

通用規則

  1. 【強制】 代碼中的命名均不能以下劃線_或美元符號$開始,也不能以下劃線_或美元符號$結束[2]

    規範錯誤示例

    // 反例
    private String _name;
    private String __name;
    private String name_;
    private String $Object;
    private String name$;
    private String Object$;
    
    
  2. 【強制】 代碼中的命名嚴禁使用拼音與英文混合的方式,更不允許直接使用中文的方式[2]

    說明:正確的英文拼寫和語法可以讓閱讀者易於理解,避免歧義。注意,即使純拼音命名方式也要避免採用。

    規範示例

    // 國際通用的命名,例如suning/nanjing等可以使用拼音
    public String suningName = "suning";
    public String nanjingName = "nanjing";
    
    // 反例,用於表示圓點是否顯示
    public String dianShow;
    public String dianHide;
    // 正例,必須使用英文
    public String dotShow;public String dotHide;
    
    
  3. 【推薦】 如果模塊、接口、類、方法使用了設計模式,在命名時要體現出具體模式[2]

    說明:將設計模式體現在名字中,有利於閱讀者快速理解架構設計理念。

    規範正確示例

    public class OrderFactory;
    public class LoginProxy;
    public class ResourceObserver;
    
    
  4. 【強制】 中括號[]是數組類型的一部分,數組定義如下[2]

    規範示例

    //正例
    String[] args
    //反例
    String args[]
    
    
  5. 【推薦】 爲了達到代碼自解釋的目標,任何自定義編程元素在命名時,使用盡量完整的單詞組合來表達其意[2]

    規範示例

    // 正例 從遠程倉庫拉取代碼
    public class PullCodeFromRemoteRepository{}
    // 反例 不知其義的命名
    public int a;
    
    
  6. 【推薦】 接口類中的方法和屬性不要加任何修飾符號(public也不要加),保持代碼的簡潔性,並加上有效的Javadoc 註釋。儘量不要在接口裏定義變量,如果一定要定義變量,肯定是與接口方法相關,並且是整個應用的基礎常量[2]
    說明:JDK 8 中接口允許有默認實現,那麼這個default方法,是對所有實現類都有價值的默認實現。

    規範示例

    // 反例
    public interface CarouselButtonClickListener{
        public String COMPANY = "suning";
        public abstract void onLeftBtnClick();
        public abstract void onRightBtnClick();
    }
    
    // 正例
    public interface CarouselButtonClickListener{
        String COMPANY = "suning";
        void onLeftBtnClick();
        void onRightBtnClick();
    }
    
    

包命名規則

  1. 【強制】 包名統一使用小寫,必須遵從。

    規範示例

    // 正例
    com.suning.mobile.epa.util
    com.suning.mobile.epa.common
    // 反例
    com.suning.mobile.epa.Util
    com.suning.mobile.epa.Common
    
    
  2. 【強制】 連續的單詞只是簡單的連接起來,不使用下劃線。

    規範示例

    // 正例
    com.suning.mobile.epa.commonutil
    // 反例
    com.suning.mobile.epa.commonUtil
    com.suning.mobile.epa.Common_Util
    
    
  3. 【強制】 點分隔符之間有且僅有一個自然語義的英語單詞。

    規範示例

    // 正例
    com.suning.mobile.epa.activity.message.commonutil
    // 反例
    com.suning.mobile.epa.activitymessagecommonutil
    
    
  4. 【強制】 包名採用反域名命名規則,一級包名爲com / cn / net,二級包名可以爲個人/公司的名字,三級包名根據應用名稱進行命名,四級包名爲模塊名或層級名。

  5. 【強制】 包名統一使用單數形式,但是類名如果有複數含義,類名可以使用複數形式。

    規範示例

    // 正例 包名
    com.suning.epamobile.util
    // 正例 類名
    MessageUtils
    //反例 包名
    com.suning.epamobile.utils
    
    
  6. 【強制】 一般情況下,包名可以按照層級劃分;而對於比較大的項目,也可以按照業務來劃分,便於單獨某個業務的管理。

    說明
    m.company.appnameabbr.activity
    m.company.appnameabbr.fragment
    m.company.appnameabbr.model
    m.company.appnameabbr.presenter
    m.company.appnameabbr.adapter
    m.company.appnameabbr.service
    m.company.appnameabbr.receiver
    m.company.appnameabbr.provider
    m.company.appnameabbr.util
    m.company.appnameabbr.ui
    m.company.appnameabbr.base
    m.company.appnameabbr.db

類命名風格

  1. 【強制】 類名使用大駝峯形式UpperCamelCase 風格,必須遵從。

    規範示例

    // 正例
    public class XmlService{}
    public class TcpUdpDeal{}
    // 反例
    public class XMLService{}
    public class XmlSeTCPUDPDealrvice{}
    
    
  2. 【推薦】 儘量避免縮寫,除非該縮寫是衆所周知的。

    規範示例

    //反例 point
    public String poi;
    //反例 dateformat
    public String df;
    //正例 message
    public String msg;
    //正例 background
    public String bg;
    
    
  3. 【推薦】 類名通常是名詞或名詞短語,接口名稱有時可能是形容詞或形容詞短語,現在還沒有特定的規則或行之有效的約定來命名註解類型。

    規範示例

    //反例
    public class Query{};
    public interface User{};
    //正例
    public class MessageDao{};
    public interface UserDataChanged{};
    
    
  4. 【推薦】 特定類型的子類需要使用統一的前綴/後綴

    說明 舉例
    tivity 類 使用 Activity 爲後綴
    agment 類 使用 Fragment 爲後綴
    del 模型類 使用 Model 爲後綴
    esenter 類 使用 Presenter 爲後綴
    apter 適配器類 使用 Adapter 爲後綴
    rvice 類 使用 Service 爲後綴
    oadcastReceiver 類 使用 Receiver 爲後綴
    ntentProvider 使用 Provider 爲後綴
    方法類 使用 Utils / Managers 爲後綴
    義控件類 使用 View 或者其繼承的父類爲後綴
    使用 Parser 爲後綴
    庫類 使用 SqliteOpenHelper 爲後綴
    義的共享基礎類 使用 Base 爲前綴
    使用 Abstract 爲前綴
    使用它要測試的類名爲前綴,以 Test 爲後綴
    使用 Exception 爲後綴
    多以 I / On 爲前綴,以 able / ible /Listener 爲後綴
  5. 【參考】 枚舉類名建議帶上Enum後綴,枚舉成員名稱需要全大寫,單詞間用下劃線隔開 [2]

    規範示例

    // 反例
    public enum ProcessStatus{
        success, unKnowREASON;
    }
    // 正例
    public enum ProcessStatusEnum{
        SUCCESS, UNKNOW_REASON;
    }
    
    

方法命名規則

  1. 【強制】 方法名使用小駝峯形式 lowerCamelCase 風格,必須遵從。

    規範示例

    // 正例
    getHttpMessage()
    // 反例
    GetHttpMessage()
    
    
  2. 【推薦】 方法名通常是動詞或動詞短語。

  3. 【推薦】 通常特定的方法會使用約定俗成的單詞

    法名 說明
    nitXX() 初始化相關的方法,使用 init 爲前綴
    sXX() / checkXX() 方法返回值爲 boolean 型的方法,使用 is / check 爲前綴
    etXX() 返回某個值、獲取單個對象的方法,使用 get 爲前綴
    aveXX() / insertXX() 數據庫插入的方法,使用 save / insert 爲前綴
    emoveXX() / deleteXX() 數據庫刪除的方法,使用 remove / delete 爲前綴
    pdateXX() 數據庫修改的方法,使用 update 爲前綴
    ueryXX() 數據庫查詢的方法,使用 query 爲前綴
    aveXX() 保存數據相關的方法,使用 save 爲前綴
    esetXX() 數據重組、恢復初始狀態的方法,使用 reset 爲前綴
    learXX() 清空相關的方法,使用 clear 爲前綴
    andleXX() / processXX() 處理相關的方法,儘量使用 handle / process 爲前綴
    isplayXX() / showXX() 展示彈窗、提示信息的方法,使用 display / show 爲前綴
    ismissXX() 銷燬彈窗的方法,使用 dismiss 爲前綴
    otoXX() 跳轉的方法,使用 goto 爲前綴
    rawXX() 繪製相關的方法,使用 draw 爲前綴

變量命名規則

  1. 【強制】 參數名、成員變量、局部變量都統一使用小駝峯形式 lowerCamelCase 風格,必須遵從

    規範示例

    // 正例:
    public int localValue;
    public int inputUserId;
    // 反例:
    public int localvalue;
    public int input_userId;
    
    
  2. 【強制】 類中控件名稱必須與 xml 佈局 id 保持一致。

    規範示例

    // 正例:
    btnCancel = (Button)findViewById(R.id.btn_cancel);
    tvTitle = (TextView)findViewById(R.id.tv_title);
    // 反例:
    cancel = (Button)findViewById(R.id.btn_cancel);
    title = (TextView)findViewById(R.id.head);
    
    
  3. 【推薦】 用統一的量詞。

    說明:通過在結尾處放置一個量詞,就可創建更加統一的變量,它們更容易理解,也更容易搜索。

    詞後綴 說明
    irst 一組變量中的第一個
    ast 一組變量中的最後一個
    ext 一組變量中的下一個變量
    rev 一組變量中的上一個
    ur 一組變量中的當前變量

    規範示例

    // 正例
    strCustomerFirst / strCustomerLast
    // 反例
    strFirstCustomer / strLastCustomer
    
    
  4. 【推薦】 Activity 中的 View 變量推薦使用View縮寫_邏輯名稱的模式。如果佈局很複雜,建議將佈局分成多個模塊,每個模塊定義一個moduleViewHolder,其成員變量包含所屬的 View

常量命名規則

  1. 【強制】 常量名統一使用 CONSTANT_CASE 風格,全部大寫,單詞間用下劃線隔開,力求語義表達完整清楚,不要嫌名字長 [2]

    規範示例

    // 正例:
    MAX_PAGE_COUNT
    // 反例:
    MAX_COUNT
    MAXPAGECOUNT
    
    
  2. 【強制】 不允許任何魔法值(即未經定義的常量)直接出現在代碼中 [2]

    規範示例

    // 反例
    if(model.get(i).equals("2")){}
    switch (code){
        case 1:
            ...
        case 2:
            ...
    }
    // 正例
    public static final String WEB_TYPE_MESSAGE = "2";
    public static final  int HOT_CITIES = 1;
    public static final  int ALL_CITIES = 2;
    ...
    if(model.get(i).equals(WEB_TYPE_MESSAGE)){}
    switch (code){
        case HOT_CITIES:
            ...
        case ALL_CITIES:
            ...
    }
    
    
  3. 【強制】 long或者Long初始賦值時,值使用大寫的L,不能是小寫的l,小寫容易跟數字1混淆,造成誤解[2]

    規範示例

    // 正例:
    Long a = 2L;
    // 反例:
    Long a = 2l;
    
    

    說明Long a = 2l;寫的是數字的21,還是Long型的2?

  4. 【推薦】 不要使用一個常量類維護所有常量,應按常量功能進行歸類,分開維護[2]

    說明:大而全的常量類,非得使用查找功能才能定位到修改的常量,不利於理解和維護。

    正例:緩存相關常量放在類CacheConsts下;系統配置相關常量放在類ConfigConsts下。

  5. 【推薦】 常量的複用層次:應用內共享常量、子工程內共享常量、包內共享常量、類內共享常量[2]

    • 應用內共享常量:放置在一方庫中,通常是modules中的constant目錄下。

    • 子工程內部共享常量:即在當前子工程的constant目錄下。

    • 包內共享常量:即在當前包下單獨的constant目錄下。

    • 類內共享常量:直接在類內部private static final定義。

    規範4-5示例

    
    // 反例    
    // com.epa.suning.mobile.Constants
    public static final int LOGIN_SUCCESS_CODE = 1;
    public static final int LOGIN_SUCCESS_CODE = 2;
    public static final int HOME_PULL_TO_REFRESH_PULL = 1;
    public static final int HOME_PULL_TO_REFRESH_REFRESHING = 2;
    public static final int HOME_PULL_TO_REFRESH_DONE = 3;
    
    // 正例
    // com.epa.suning.mobile.login.LoginConstants
    public static final int LOGIN_SUCCESS_CODE = 1;
    public static final int LOGIN_SUCCESS_CODE = 2;
    // com.epa.suning.mobile.home.HomeConstants
    public static final int HOME_PULL_TO_REFRESH_PULL = 1;
    public static final int HOME_PULL_TO_REFRESH_REFRESHING = 2;
    public static final int HOME_PULL_TO_REFRESH_DONE = 3;
    
    
  6. 【推薦】 如果變量值僅在一個範圍內變化,且帶有名稱之外的延伸屬性,定義爲枚舉類。下面正例中的數字就是延伸信息,表示星期幾[2]

    規範示例

    public enum WeekEnum {
    	
    	MONDAY(1), TUESDAY(2), WEDNESDAY(3), 
    	THURSDAY(4), FRIDAY(5), SATURDAY(6), SUNDAY(7);
    	private int index;
    	WeekEnum(int idx) {
    		this.index = idx;
    	}
    	public int getIndex() {
    		return index;
    	}
    }
    
    

drawable 資源文件命名規則

  1. 【強制】 資源文件名統一使用小寫,必須遵從。

  2. 【強制】 採用下劃線命名法,加前綴區分命名模式:activity名稱_邏輯名稱 / common_邏輯名稱。

  3. 【推薦】 drawable文件夾中的資源文件的命名規則

    文件名 說明
    n_xxx 使用 selector 時不必聲明按鈕狀態
    n_xxx_normal 正常情況效果
    n_xxx_pressed state_pressed 按下效果
    n_xxx_focused state_focused 聚焦效果
    n_xxx_disabled state_disabled(false) 不可用效果
    n_xxx_checked state_checked 選中效果
    n_xxx_selected state_selected 選中效果
    n_xxx_hovered state_hovered 懸停效果
    n_xxx_checkable state_checkable 可選效果
    n_xxx_checkable state_checkable 可選效果
    n_xxx_activated state_activated 激活的
    n_xxx_windowfocused state_window_focused

anim 動畫文件命名規則

  1. 【強制】 資源文件名統一使用小寫,必須遵從。

  2. 【強制】 採用下劃線命名法,加前綴區分命名模式:anim類型_方向。

  3. 【推薦】 anim文件夾中的動畫文件的命名規則

    畫文件名 說明
    ade_in 淡入
    ade_out 淡出
    ush_down_in 從下方推入
    ush_down_out 從下方推出
    ush_left 推向左方
    lide_in_from_top 從頭部滑動進入
    oom_enter 變形進入
    lide_in 滑動進入
    hrink_to_middle 中間縮小

    資源文件規範示例

    // 反例
    activityHome
    ActivityLoginSuccess
    selected
    fade_in
    
    // 正例
    activity_home
    activity_login_success
    btn_select
    anim_fadein
    
    

約定的縮寫

  1. 【強制】 杜絕完全不規範的縮寫,避免望文不知義。

    說明:隨意縮寫會嚴重降低代碼的可閱讀性。

    正例:

    • ResponseMessage縮寫命名成RspMsg
    • ErrorCode縮寫命名成ErrCode

    反例:

    • AbstractClass縮寫命名成AbsClass
    • condition縮寫命名成condi
  2. 【推薦】 日常常用的英文單詞縮寫

    縮寫
    on
    lor
    vider
    lector
    erage
    ckground
    ffer
    ntrol
    lete
    cument
    ror
    cape
    crement
    fomation
    itial
    age
    ternationlization
    ngth
    brary
    ssage
    ssword
    sition
    rver
    ring
    mp
    ndow
  3. 【強制】 Android 常用 View 的英文單詞縮寫

    縮寫
    nearLayout
    lativeLayout
    ameLayout
    bleLayout
    xtView
    ageView
    idView
    itText
    toCompleteTextView
    tton
    ageButton
    ggleButton
    dioButton
    eckBox
    xtSwitch
    ageSwitch
    alogClock
    gtalClock
    tePicker
    mePicker
    ogressBar
    ntingBar
    ekBar
    bView
    pView
    deoView
    rollView
    stView
    pandableList
    b
    ronometer
    inner
    omControls

代碼格式

  1. 【強制】 大括號的使用約定。如果是大括號內爲空,則簡潔地寫成{}即可,不需要換行;如果是非空代碼塊則:

    • 左大括號前不換行;
    • 左大括號後換行;
    • 右大括號前換行;
    • 右大括號後還有else等代碼則不換行;表示終止的右大括號後必須換行。
  2. 【強制】 左小括號和字符之間不出現空格;同樣,右小括號和字符之間也不出現空格。

    正例:if (a == b)
    反例:if ( a == b )

  3. 【強制】 if / for / while / switch / do / try / catch / synchronized等保留字與括號之間都必須加空格。

  4. 【強制】 任何二目、三目運算符的左右兩邊都需要加一個空格。

    說明:運算符包括賦值運算符=、邏輯運算符&&、加減乘除符號等。

  5. 【強制】 採用 4 個空格縮進,禁止使用 tab 字符。

    說明:如果使用 tab 縮進,必須設置 1 個 tab 爲 4 個空格。

    IDEA 設置 tab 爲 4 個空格時,請勿勾選 Use tab character;而在 eclipse 中,必須勾選 insert spaces for tabs

    規範1-5示例

    public static void main(String[] args) {
    	// 縮進4個空格
    	String say = "hello";
    
    	// 運算符的左右必須有一個空格
    	int flag = 0;
    
    	// 關鍵詞if與括號之間必須有一個空格
    	// 括號內的f與左括號, 0與右括號不需要空格
    	if (flag == 0) {
    		System.out.println(say);
    	}
    
    	// 左大括號前加空格且不換行;左大括號後換行
    	if (flag == 1) {
    		System.out.println("world");
    
    	// 右大括號前換行,右大括號後有else,不用換行
    	} else {
    		System.out.println("ok");
    
    	// 在右大括號後直接結束,則必須換行
    	}
    
    }
    
    
  6. 【強制】 註釋的雙斜線與註釋內容之間有且僅有一個空格。

    規範示例

    //這是一個反例註釋
    /*
    這是一個反例註釋
    */
    /*
     *這是一個反例註釋
     */
     
    // 這是一個正例註釋
    /*
     * 這是一個反例註釋
     */
    
    
  7. 【強制】 單行字符數限制不超過 120 個,超出需要換行,換行時遵循如下原則:

    • 第二行相對第一行縮進 4 個空格,從第三行開始,不再繼續縮進,參考示例;
    • 運算符與下文一起換行;
    • 方法調用的點符號與下文一起換行;
    • 方法調用時,多個參數,需要換行時,在逗號後進行;
    • 在括號前不要換行,見反例。

    規範示例

    // 正例
    StringBuffer sb = new StringBuffer();
    // 超過 120個字符的情況下,換行縮進4個空格,點號和方法名稱一起換行
    sb.append("zi").append("xin")...
    	.append("huang")...
    	.append("huang")...
    	.append("huang");
    
    // 反例
    StringBuffer sb = new StringBuffer();
    // 超過 120個字符的情況下,不要在括號前換行
    sb.append("zi").append("xin")...append
    ("huang");
    
    // 參數很多的方法調用可能超過120個字符,不要在逗號前換行
    method(args1, args2, args3, ...
    , argsX);
    
    
  8. 【強制】 方法參數在定義和傳入時,多個參數逗號後邊必須加空格。

    規範示例

    //正例
    method("a", "b", "c");
    //反例
    method("a" ,"b" ,"c");
    
    
  9. 【強制】 IDE 的 text file encoding 設置爲 UTF-8。

  10. 【強制】 IDE 中文件的換行符使用 Unix 格式,不要使用 Windows 格式。

  11. 【推薦】 沒有必要增加若干空格來使某一行的字符與上一行對應位置的字符對齊。

    規範示例

    //正例
    int a = 3;
    long b = 4L;
    float c = 5F;
    StringBuffer stringBuffer = new StringBuffer();
    
    // 反例
    int          a            = 3;
    long         b            = 4L;
    float        c            = 5F;
    StringBuffer stringBuffer = new StringBuffer();
    
    

    說明:增加stringBuffer這個變量,如果需要對齊,則給a、b、c都要增加幾個空格,在變量比較多的情況下,是一種累贅的事情。

  12. 【推薦】 方法體內的執行語句組、變量的定義語句組、不同的業務邏輯之間或者不同的語義之間插入一個空行。相同業務邏輯和語義之間不需要插入空行。

    說明:沒有必要插入多個空行進行隔開。


註釋規範

  1. 【強制】 類、類屬性、類方法的註釋必須使用 Javadoc 規範,使用/**內容*/格式,不得使用// xxx 方式 需要包含:類的概括描述、類的詳細描述、類的作者

    /**
     * 〈一句話功能簡述〉<br>
     * 〈功能詳細描述〉
     * @author  作者
     * @see [相關類/方法](可選)
     * @since [產品/模塊版本] (可選)
     */
     
    
  2. 【強制】 類文件頭註釋,文件頭註釋需要包含:文件創建時間,版權信息、文件名、作者。

    /**
     * Copyright (C),2002-2018, 蘇寧軟件技術有限公司<br>
     * FileName: 文件名 <br>
     * Author:   作者 <br>
     * Date:     2017年12月28日 下午2:16:23 <br>
     * Description: //模塊目的、功能描述  <br>
     * History: //修改記錄 <br>(可選)
     * <author>   <time>   <version>    <desc> <br>
     * 修改人姓名  修改時間    版本號        描述  <br>
     */
     
    
  3. 【強制】 方法註釋:包含:方法的功能描述、方法的每一個參數的含義、方法的返回值說明(可選)、以及作者。

    /**
     *功能描述: <br>
     * <詳細描述>
     * @param  入參    參數說明
     * @return  返回參數  參數說明
     * @author  作者
     * @see [相關類/方法](可選)
     * @since [產品/模塊版本](可選)
     */
    
    
  4. 【強制】 修改別人代碼時的註釋方法要補充,功能添加在方法中註釋添加,方法體內在相應代碼行處添加行註釋,來說明。

  5. 【強制】 方法內部單行註釋,在被註釋語句上方另起一行,使用//註釋。方法內部多行註釋使用/* */註釋,注意與代碼對齊。
    說明:在邏輯處理中的關鍵步驟要編寫業務註釋,便於自己和他人讀懂代碼處理。

  6. 【強制】 成員變量註釋。
    說明
    常量註釋:採用“/** */”註釋符,準確表達變量含義即可;
    變量註釋:採用“//”註釋符,特指方法內的局部變量。

日誌規範

  1. 【強制】 不要把敏感信息打印到 log 中。
    說明:
    在 APP 的開發過程中,爲了方便調試,通常會使用 log 函數輸出一些關鍵流程的信息,這些信息中通常會包含敏感內容,如執行流程、明文的用戶名密碼等,這會讓攻擊者更加容易的瞭解 APP 內部結構方便破解和攻擊,甚至直接獲取到有價值的敏感信息。
  2. 【強制】 不能使用 System.out.println 打印 log。
  3. 【強制】Logtag 不能是" "。
  4. 【強制】 Tag : 統一使用當前的類名命名
    private static final String TAG = XXX.class.getSimpleName();
    Log.i(TAG,"");
    
  5. 【強制】 Text:要說明信息的情況
    Log.i(TAG,"登錄請求=”+” [{"mobile":"15622334614","pwd":"123456"}]");
    Log.i(TAG,"登錄返回=”+” [{"XXX":"XXX","XXX":"XXX"}]"); 
    
  6. 【強制】 一般信息用log.i輸出;一些警告,異常用log.w輸出等,不得濫用log.w,log.e

參考文獻

[1] 宋志高. Android 編碼規範. 中國, 2017.

[2] Alibaba. 阿里巴巴 Java 開發手冊終極版. 電子工業出版社, 中國, 1.3.0 edition, 2017.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章