Android 编码规范

源文件规范

  1. 文件名:源文件名必须和它包含的顶层类名保持一致,包括大小写,并以.java作为后缀名。
  2. 文件编码:所有源文件编码必须是UTF-8

命名

  1. 包名
    命名规则:一个唯一包名的前缀总是全部小写的ASCII字母并且是一个顶级域名,通常是com,edu,gov,mil,net,org。包名的后续部分根据不同机构各自内部的命名规范而不尽相同。这类命名规范可能以特定目录名的组成来区分部门 (department), 项目(project),机器(machine),或注册名(login names)。例如: com.domain.xx 。 包命名必须以com.domain开始,后面跟有项目名称(或者缩写),再后面为模块名或层级名称。
    如:com.domain.项目缩写.模块名 com.domain.xx.bookmark
    如:com.domain.项目缩写.层级名 com.domain.xx.activity

  2. 类和接口命名
    命名规则:类名是个一名词,采用大小写混合的方式,每个单词的首字母大写。尽量使你的类名简洁而富于描述。使用完整单词,避免缩写词(除非该缩写词被更广泛使用,像 URL,HTML) 接口一般要使用able,ible,er等后缀。类名必须使用驼峰规则,即首字母必须大写,如果为词组,则每个单词的首字母也必须要大写,类名必须使用名词,或名词词组。要求类名简单,不允许出现无意义的单词。

  3. 方法的命名
    命名规则:方法名是一个动词,采用大小写混合的方式,第一个单词的首字母小写,其后单词的首字母大写。例如: public void run(); public String getBookName(); 类中常用方法的命名:

  • 类的获取方法(一般具有返回值)一般要求在被访问的字段名前加上get。如getFirstName(),getLastName()。一般来说,get前缀方法返回的是单个值,find前缀的方法返回的是列表值。- 类的设置方法(一般返回类型为void):被访问字段名的前面加上前缀 set。如setFirstName(),setLastName()。- 类的布尔型的判断方法一般要求方法名使用单词ishas做前缀。如isPersistent(),isString().或者使用具有逻辑意义的单词,例如equalequals。- 类的普通方法一般采用完整的英文描述说明成员方法功能,第一个单词尽可能采用动词,首字母小写。如openFile(), addCount()。- 构造方法应该用递增的方式写,(参数多的写在后面)。- toString()方法:一般情况下,每个类都应该定义toString().
  1. 变量命名
    命名规则:第一个单词的首字母小写,其后单词的首字母大写。变量名不应以下划线或美元符号开头,尽管这在语法上是允许的。变量名应简短且富于描述。变量名的选用应该易于记忆,即,能够指出其用途。尽量避免单个字符的变量名,除非是一次性的临时变量。临时变量通常被取名为 i,j,k,m,n它们一般用于整型;c,d,e 它们一般用于字符型。在Android中成员变量,非publicstatic的变量可以使用m开头,非常量的static变量可以使用s开头。变量命名也必须使用驼峰规则,但是首字母必须小写,变量名尽可能的使用名词或名词词组。同样要求简单易懂,不允许出现无意义的单词。例如:private String mBookName;

  2. 常量命名
    命名规则:类常量的声明,应该全部大写,单词间用下划线隔开。例如:private static final int MIN_WIDTH = 4;

  3. 异常命名
    自定义异常的命名必须以Exception为结尾。已明确标示为一个异常。

  4. layout命名
    layout.xml的命名必须以全部单词小写,单词间以下划线分割,并且使用名词或名词词组,即使用 模块名功能名称所属页面类型 来命名。如:video_controller_player_activity 视频模块下的-控制栏-属于播放器的-Activity页

  5. id命名
    ·layout中所使用的id必须以全部单词小写,单词间以下划线分割,并且使用名词或名词词组,并且要求能够通过id直接理解当前组件要实现的功能。如:某TextView @+id/tv_book_name_show。如:某EditText @+id/et_book_name_edit

  6. 资源命名
    layout中所使用的所有资源(如drawable,style等),命名必须以全部单词小写,单词间以下划线分割,并且尽可能的使用名词或名词组, 即使用 模块名_用途 来命名。如果为公共资源,如分割线等,则直接用用途来命名 ,如:menu_icon_navigate.png,如:某分割线:line.pngseparator.png

注释

Java程序有两类注释:实现注释(implementation comments)和文档注释(document comments)
实现注释是使用/.../和//界定的注释。文档注释(被称为"doc comments")由/*.../界定。文档注释可以通过javadoc 工具转换成HTML 文件。

  1. 类注释
    每一个类都要包含如下格式的注释,以说明当前类的功能等。
    /**

    • 类名
    • @author 作者
    • 实现的主要功能。
    • 创建日期
    • 修改者,修改日期,修改内容。
      */
  2. 方法注释
    每一个方法都要包含 如下格式的注释 包括当前方法的用途,当前方法参数的含义,当前方法返回值的内容和抛出异常的列表。
    /**

    • 方法的一句话概述
    • <p>方法详述(简单方法可不必详述)</p>
    • @param s 说明参数含义
    • @return 说明返回值含义
    • @throws IOException 说明发生此异常的条件
    • @throws NullPointerException 说明发生此异常的条件
      */
  3. 类成员变量和常量注释
    成员变量和常量需要使用java doc形式的注释,以说明当前变量或常量的含义
    /**

    • XXXX含义
      */
  4. 其他注释
    方法内部的注释 如果需要多行 使用/…… /形式,如果为单行是用//……形式的注释。
    不要再方法内部使用 java doc 形式的注释“/
    ……*/”

代码风格

  1. 缩进
    除了换行符之外,ASCII空格(0x20)是唯一合法的空格字符。这意味着不允许使用Tab进行缩进,应该使用空格进行缩进,推荐缩进为4个空格,Eclipse中将Tab替换为4个空格的设置方法(很多人都习惯直接按4次空格,感觉不设置习惯了也挺好)。- 代码设置:Window->Preferences->General->Editors->Text Editors->勾选Insert spaces for tabs``。- XML文件的Tab配置:Window->Preferences->XML->XML Files->Editor>选择右侧区域的Indent using spaces`

  2. 空行
    空行将逻辑相关的代码段分隔开,以提高可读性。 下列情况应该总是使用空行:

  • 一个源文件的两个片段之间

  • 类声明和接口声明之间

  • 两个方法之间

  • 方法内的局部变量和方法的第一条语句之间

  • 一个方法内的两个逻辑段之间,用以提高可读性

    通常在 变量声明区域之后要用空行分隔,常量声明区域之后要有空行分隔,方法声明之前要有空行分隔。

  1. 方法
  • 一个方法尽量不要超过15行(可能会有难度,但是尽量不要太多,弄个方法几千行这是绝对不允许的),如果方法太长,说明当前方法业务逻辑已经非常复杂,
    那么就需要进行方法拆分,保证每个方法只作一件事。
  • 不要使用try catch处理业务逻辑!!!!
  1. 参数和返回值

    • 一个方法的参数尽可能的不要超过4个(根据情况可能也会有些难度)
    • 如果一个方法返回的是一个错误码,请使用异常!!
    • 尽可能不要使用null替代为异常
  2. 神秘数字
    代码中不允许出现单独的数字,字符!如果需要使用数字或字符,则将它们按照含义封装为静态常量!(for语句中除外)

  3. 控制语句
    判断中如有常量,则应将常量置于判断式的右侧。如:
    if (true == isAdmin())...
    尽量不要使用三目条件的嵌套。

    ifelsefordowhile语句中,即使没有语句或者只有一行,也不得省略花括号:

    if (true){
        //do something......
    }
    

    不要使用下面的方式:

    if (true)
        i = 0; //不要使用这种
    

    对于循环:
    //将操作结构保存在临时变量里,减少方法调用次数

    final int count = products.getCount();
    while(index < count){
        // ...
    }
    

    而不是

    while(index < products.getCount()){
        //每此都会执行一次getCount()方法,
        //若此方法耗时则会影响执行效率
        //而且可能带来同步问题,若有同步需求,请使用同步块或同步方法
    }
    
  1. 访问控制
    若没有足够理由,不要把实例或类变量声明为公有。

  2. 变量赋值
    不要使用内嵌(embedded)赋值运算符试图提高运行时的效率,这是编译器的工作。例如:
    d = (a = b + c) + r;
    应该写成

    a = b + c; 
    d = a + r; 
    
  3. 圆括号的试用
    一般而言,在含有多种运算符的表达式中使用圆括号来避免运算符优先级问题,是个好方法。即使运算符的优先级对你而言可能很清楚,但对其他人未必如此。你不能假设别的程序员和你一样清楚运算符的优先级。不要这样写:if (a == b && c == d),正确的方式为:if ((a == b) && (c == d))

  4. 返回值
    设法让你的程序结构符合目的。例如:

    if (booleanExpression) { 
        return true; 
    } else { 
        return false; 
    } 
    

    应该代之以如下方法:
    return booleanExpression

    类似地:

    if (condition) { 
        return x; 
    } 
    return y; 
    

    应该写做:
    return (condition ? x : y);

  5. 条件运算符?前的表达式
    如果一个包含二元运算符的表达式出现在三元运算符" ? : "的"?"之前,那么应该给表达式添上一对圆括号。例如: (x >= 0) ? x : -x

  6. 所有未使用的import语句应该被删除。

  7. 重载(Overload)方法必须放在一起

  8. 非空块中花括号的使用
    在非空代码块中使用花括号时要遵循K&R风格`(Kernighan and Ritchie Style):左花括号({)前不能换行,在其后换行。在右花括号(})前要有换行。

  9. 空代码块中花括号的使用
    如果一个代码块是空的,可以直接使用{}。除了if/else-if/elsetry/catch/finally这样的多块语句.

  10. 列宽
    列宽必须为120字符,以下情况可以不遵守列宽限制:无法限制宽度的内容,比如注释里的长URLpackageimport语句;注释中需要被粘贴到Shell里去执行的命令

  11. 枚举
    用逗号分割每个枚举变量,并且变量要单独在一行

    enum Color {
        RED,
        GREEN,
        YELLOW
    }
    
  12. 长整形数字
    长整型数字必须使用大写字母L结尾,不能使用小写字母l,以便和数字1进行区分。例如使用3000000000L而不是3000000000l

开发格式统一

  1. Eclipse
    Windows -> Preferences -> Java -> Code Style
    然后选择Import导入相应的Clean UpCode TemplatesFormatter等XML文件。如果不需要Copyright信息,想要自定义的,可以不导入Code Templates。

  2. IDEA
    File -> Import Settings选择下载链接中的IDEA_Style.jar文件,可以看到两个选项,只需代码风格的,可以仅选择Code style schemes,如果需要默认的Copyright信息,选择Default Project settings

代码严谨性要求

  1. ArrayList通过get方法使用下标获取元素,如果使用的下标不在ArrayList大小范围内,将产生java.lang.IndexOutOfBoundsException的异常,导致app出现Crash

  2. 方法中存在return null返回对象直接进行方法调用隐患, 在使用时需要先判断是否为null,一般尽量不要在方法中直接return null,最好用异常代替。

  3. 销毁Dialog前是否isShowing未判断隐患
    调用Android.app.Dialog.cancel()方法前,如果这个dialog不处于showing状态时,会抛出java.lang.IllegalArgumentException的异常,导致app出现Crash

  4. 使用String.split结果未判断长度隐患
    在使用String.split得到的结果数组前,未对数组进行长度检查,取字段的时候可能发生越界而导致Crash

    String source = "<br/>";
    String[] infos = source.split("<br/>");
    if(0 < infos.length){
       String poiName = infos[0];
    }
    

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容

  • Android编码规范 源文件基础 文件名 源文件以其最顶层的类名来命名,大小写敏感,文件扩展名为.java。 文...
    呼呼哥阅读 932评论 0 0
  • 作者:李旺成 时间:2016年4月3日 1. 前言 这份文档参考了 Google Java 编程风格规范和 Goo...
    diygreen阅读 39,858评论 19 224
  • Android 编码规范 1. 前言 这份文档是 Google Java Code Style 的译文,并稍有添加...
    人失忆阅读 443评论 0 3
  • 参考文章:http://keeganlee.me/post/android/20150709 http://www...
    yangzming阅读 930评论 0 0
  • androidstudio集成checkstyle提交前校验方法,将pre-commit文件copy到工程目录.g...
    Chris锅阅读 887评论 0 0