查看: 2458|回复: 0

[Android教程] Java编程规范

发表于 2018-1-11 08:00:00

从一开始接触编程就多次听到编程得养成好的编码习惯。的确,不让好的编码成为习惯,也就只能在随意的代码风格里放纵了(网上浏览到的代码是有这样的吧)。

在网上也看了很多人的总结,学到很多。将其中的部分进行汇总,这次的随笔大部分只是文字的搬运工,如有误还请指正。

一.标识符命名(尽量以最少的字符表达完整的含义,但是命名中缩写使用:尽量不要用缩写,除非该缩写是约定俗成的。)

常见的英文单词缩写:

1.1 驼峰(Camel)命名法:又称小驼峰命名法,除首单词外,其余所有单词的第一个字母大写。

例:touchEvent,用于“方法名”,“变量名”,“参数名”(参数应该避免用单个字符命名。)
1.2 帕斯卡(pascal)命名法:又称大驼峰命名法,所有单词的第一个字母大写。

例:TouchEvent,用于“接口名”、“类名”。
1.3 下划线命名法:单词与单词间用下划线做间隔。

例:touch_event,用于“常量名”命名(字母全大写载用下划线命名,如:TOUCH_DOWN)、“资源文件”、“控件”及“布局文件”(字母小写)等。

1.4.其他。

包(package): 采用反写域名命名规则,即com.xx.xxx.xxxx形式,如:com.tencent.qq.activitys

全部使用小写字母。一级包名为com,二级包名为xx(一般为公司或个人域名),三级包名根据应用进行命名,四级包名为功能模块名。

二:源文件结构

一个源文件包含(按顺序地):

  1. 许可证或版权信息(如有需要)
  2. package语句
  3. import语句
  4. 一个顶级类(只有一个)

以上每个部分之间用一个空行隔开。

2.1许可证或版权信息

如果一个文件包含许可证或版权信息,那么它应当被放在文件最前面。插入版权信息参考

2.2 import语句

import不要使用通配符*,即引入同一个包下面多个class的偷懒写法。一般不建议这样写。

import语句可分为以下几组,按照这个顺序,每组由一个空行分隔:

  1. 所有的静态导入独立成组
  2. com.google imports(仅当这个源文件是在com.google包下)
  3. 第三方的包。每个顶级包为一组,字典序。例如:android, com, junit, org, sun
  4. java imports
  5. javax imports

组内不空行,按字典序排列。

2.3 类声明

只有一个顶级类声明(在与他同名的源文件中)

注:1.类成员顺序:每个类应该以某种逻辑去排序它的成员(最好不要简单的按照时间顺序添加到成员最后)。

2.当一个类有多个构造函数,或是多个同名方法,这些函数/方法应该按顺序出现在一起,中间不要放进其它函数/方法。

三、格式

3.1大括号

大括号与if, else, for, do, while语句一起使用,即使只有一条语句(或是空),也应该把大括号写上。

对于非空块和块状结构:

  • 左大括号前不换行
  • 左大括号后换行
  • 右大括号前换行
  • 如果右大括号是一个语句、函数体或类的终止,则右大括号后换行; 否则不换行。例如,如果右大括号后面是else或逗号,则不换行。
  1. return new MyClass() {
  2. @Override public void method() {
  3. if (condition()) {
  4. try {
  5. something();
  6. } catch (ProblemException e) {
  7. recover();
  8. }
  9. }
  10. }
  11. };
复制代码

花括号不要单独一行,和它前面的代码同一行。而且,花括号与前面的代码之间用一个空格隔开。

  1. public void method() { // Good
  2. }
  3. public void method()
  4. { // Bad
  5. }
  6. public void method(){ // Bad
  7. }
复制代码

一个空的块状结构里什么也不包含,大括号可以简洁地写成{},不需要换行。例外:如果它是一个多块语句的一部分(if/else 或 try/catch/finally) ,即使大括号内没内容,右大括号也要换行。

示例:

  1. void doNothing() {}
复制代码

3.2 空格使用

1.if、else、for、switch、while等逻辑关键字与后面的语句留一个空格隔开。

  1. // Good
  2. if (booleanVariable) {
  3. } else {
  4. }
  5. // Bad
  6. if(booleanVariable) {
  7. }else {
  8. }
复制代码

2.运算符两边各用一个空格隔开

  1. int result = a + b; //Good, = 和 + 两边各用一个空格隔开
  2. int result=a+b; //Bad,=和+两边没用空格隔开
复制代码

3.方法的每个参数之间用一个空格隔开。

  1. public void method(String param1, String param2); // Good,param1后面的逗号与String之间隔了一个空格
  2. method(param1, param2); // Good,方法调用时,param1后面的逗号与param2之间隔了一个空格
  3. method(param1,param2); // Bad,没有用一个空格隔开
复制代码

3.3 空行的使用

将逻辑相关的代码段用空行隔开,以提高可读性。空行也只空一行,不要空多行。在以下情况需用一个空行:

  • 两个方法之间
  • 方法内的两个逻辑段之间
  • 方法内的局部变量和方法的第一条逻辑语句之间
  • 常量和变量之间

3.4 当一个表达式无法容纳在一行内时,可换行显示,另起的新行用8个空格缩进。

  1. String str = String.format("%.3f,%.3f,%.3f,", bandGyroscopeEvent.getAngularVelocityX(),
  2. bandGyroscopeEvent.getAngularVelocityY(), bandGyroscopeEvent.getAngularVelocityZ()) + strTimestamp + "\n";
复制代码

3.5每次只声明一个变量

不要使用组合声明,比如

  1. int a, b;//bad
  2. //good
  3. int a;
  4. int b;
复制代码

3.6 量Android Studio中格式化代码快捷键

CTRL + ALT + L (Win)
OPTION + CMD + L (Mac)

3.7 枚举类

很多经典的Java书已经看到推荐使用枚举来代替int常量了,但是在android开发中不建议使用枚举,特别是大型的App中,能不用则不用。因为它会牺牲执行的速度和并大幅增加文件体积。也是性能优化中减少OOM(内存优化)的一个方面。Android总使用枚举注解代替枚举优化代码。

3.8补充

文字大小的单位统一用sp,元素大小的单位统一用dp。

应用中的字符串统一在strings.xml中定义,然后在代码和布局文件中引用。

颜色值统一在colors.xml中定义,然后在代码和布局文件中引用。另外,不要在代码和布局文件中引用系统的颜色,除了透明。

四、注解

4.1文件头注释

文件顶部统一添加版权声明,声明的格式如下:

  1. /**
  2. * Copyright (c) Microsoft Corporation All rights reserved.
  3. */
复制代码

4.2 类和接口注释

类和接口统一添加javadoc注释,格式如下:

  1. /**
  2. * 类或接口的描述信息
  3. *
  4. * @author ${USER}
  5. * @date ${DATE}
  6. */
复制代码

4.3 方法注释

下面几种方法,都必须添加javadoc注释,说明该方法的用途和参数说明,以及返回值的说明。

  • 接口中定义的所有方法
  • 抽象类中自定义的抽象方法
  • 抽象父类的自定义公用方法
  • 工具类的公用方法
  1. /**
  2. * 登录
  3. *
  4. * @param loginName 登录名
  5. * @param password 密码
  6. * @param listener 回调监听器
  7. */
  8. public void login(String loginName, String password, ActionCallbackListener<Void> listener);
复制代码

4.4 变量和常量注释

  • 接口中定义的所有常量
  • 公有类的公有常量
  • 枚举类定义的所有枚举常量
  • 实体类的所有属性变量

本随笔参考Google java编程风格指南



回复

使用道具 举报