阿里巴巴代码规范【强制】

一、编程规约

(一)命名风格

  1. 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。

反例:_name / $name / name_ / name$

  1. 严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。

正例:ali / taobao / aliyun / youku (国际通用的名称,可视同英文)

反例:pingJia(评价) DaZhe (打折) DianYing(电影)

  1. 代码和注释中避免使用任何语言的种族歧视性词语。

反例:RIBENGUIZI / slave

  1. 类名使用UpperCamelCase风格,但以下情形除外:DO/BO/DTO/VO/AO/PO/UID等

正例:ForceCode / UserDO /

反例:forcecode / userdo

  1. 方法名、参数名、成员变量、局部变量都统一使用lowerCamelCase风格。

反例:getAge / setAge / localValue

  1. 常量命名全部大写,单词间用下划线隔开,力求予以表达完整清楚,不要嫌名字长。

正例:MAX_STOCK_COUNT / CACHE_EXPRIES_TIME

  1. 抽象类命名使用 Abstract 或 Base 开头;异常类命名使用 Exception 结尾;测试类 命名以它要测试的类的名称开始,以 Test 结尾

  1. 类型与中括号紧挨相连来表示数组。

正例:int[] arrayDemo

  1. POJO 类中的任何布尔类型的变量,都不要加 is 前缀,否则部分框架解析会引起序列 化错误。

反例:Boolean isDeleted

  1. 包名统一使用小写,点分隔符之间有且仅有个自然语义的英语单词。包名统一使用 单数形式,但是类名如果有复数含义,类名可以使用复数形式

正例:com.qcby.user

  1. 避免在子父类的成员变量之间、或者不同代码块的局部变量之间采用完全相同的命名, 使可理解性降低

  1. 杜绝完全不规范的缩写,避免望文不知义。

(二)常量定义

  1. 不允许使用未经预先定义的常量

  1. 在 long 或者 Long 赋值时,数值后使用大写字母 L,不能是小写字母 l,小写容易跟 数字混淆,造成误解。

正例:Long a = 2L

反例:Long a = 2l

(三)代码格式

  1. 如果是大括号内为空,则简洁地写成{}即可,大括号中间无需换行和空格;如果是非 空代码块则: 1) 左大括号前不换行。 2) 左大括号后换行。 3) 右大括号前换行 4) 右大括号后还有 else 等代码则不换行;表示终止的右大括号后必需换行。

  1. 左小括号和右边相邻字符之间不出现空格;右小括号和左边相邻字符之间也不出现空 格;而左大括号前需要加空格。 反例:if (空格 a == b 空格)

  1. if/for/while/switch/do 等保留字与括号之间都必需加空格。

  1. 任何二目、三目运算符的左右两边都需要加一个空格。

说明:包括赋值运算符号=、逻辑运算符&&、加减乘除符号等

  1. 采用 4 个空格缩进,禁止使用 Tab 字符说明:如果使用 Tab 缩进,必需设置 1 个 Tab 为 4 个空格。IDEA 设置 Tab 为 4 个空格时,请勿勾选 Use tab character;而在 Eclipse 中,必需勾选 insert spaces for tabs澞

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");
 // 在右大括号后直接结束,则必ீ换行
    }
}
  1. 注释的双斜线与注释内容之间有且仅有一个空格

  1. 在进行类型强制转换时,右括号与强制转换值之间不需要任何空格隔开

正例: double first = 3.2d;

int second = (int)first + 2;

  1. 单行字符数限制不超过 120 个,超出需要换行,换行时遵循如下原则: 1)第二行相对第一行缩进 4 个空格,从第三行开始,不再继续缩进,参考示例。 2)运算符与下文一起换行。 3)方法调用的点符号与下文一起换行。 4)方法调用中的多个参数需要换行时,在逗号后进行。 5)在括号前不要换行,见反例

正例:
StringBuilder sb = new StringBuilder();
// 超过 120 个字符的情况下,换行缩进 4 个空格,并且方法前的点号一起换行
sb.append("yang").append("hao")...
       .append("chen")...
       .append("chen")...
       .append("chen");


反例:
StringBuilder sb = new StringBuilder();
// 超过 120 个字符的情况下,不要在括号前换行
sb.append("you").append("are")...append
      ("lucky");
// 参数很多的方法调用可能超过 120 个字符,逗号后才是换行处
method(args1, args2, args3, ...
  , argsX);
  1. 方法参数在定义和传入时,多个参数逗号后必需加空格 正例:method(args1, args2, args3)

  1. IDE 的 text file encoding 设置为 UTF-8; IDE 中文件的换行符使用 Unix 格式,不要 使用 Windows 格式.

(四)OOP规约

  1. 避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成本,直接用类名来访问即可。

  1. 所有的覆写方法,必须加@Override注解

说明getObject()与get0bject()的问题。一个是字母的O,一个是数字的0,加@Override 可以准确判断是否覆盖成功。另外,如果在抽象类中对方法签名进行修改,其实现类会马上编译报错。

  1. 相同参数类型,相同业务含义,才可以使用Java的可变参数,避免使用Object.。

说明∶可变参数必须放置在参数列表的最后。(建议开发者尽量不用可变参数编程)

正例: public List listUsers(String type, Long.. ids)f...}

  1. 外部正在调用或者二方库依赖的接口,不允许修改方法签名,避免对接口调用方产生影响。接口过时必须加@Deprecated注解,并清晰地说明采用的新接口或者新服务是什么。

  1. 不能使用过时的类或方法。

说明: java.net.URLDecoder 中的方法decode(String encodeStr)这个方法已经过时,应该使用双参数decode(String source, String encode)。接口提供方既然明确是过时接口,那么有义务同时提供新的接口;作为调用方来说,有义务去考证过时方法的新实现是什么。

  1. 6.object的equals方法容易抛空指针异常应使用常量或确定有值的对象来调用equals。

正例: "test".equals(object);

反例:object.equals("test");

说明︰推荐使用JDK7引入的工具类java.util.Objectst#equals(Object a, Object b)

  1. 所有整型包装类对象之间值的比较,全部使用equals方法比较。

说明:对于Integer var = ?在-128至127之间的赋值,Integer对象是在 IntegerCache.cache产生,会复用已有对象,这个区间内的 Integer值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用equals方法进行判断。

  1. 任何货币金额,均以最小货币单位且整型类型来进行存储。

  1. 浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用equals来判断。

说明∶浮点数采用“尾数+阶码”的编码方式,类似于科学计数法的“有效数字+指数”的表示方式。二进制无法精确表示大部分的十进制小数,具体原理参考《码出高效》。

  1. 如上所示BigDecimal的等值比较应使用compareTo()方法,而不是equals()方法。

说明:equals()方法会比较值和精度(1.0与1.00返回结果为false ),而compareTo()则会忽略精度

  1. 定义数据对象DO类时,属性类型要与数据库字段类型相匹配。

正例︰数据库字段的 bigint必须与类属性的Long类型相对应

反例︰某个案例的数据库表id字段定义类型 bigint unsigned,实际类对象属性为Integer,随着id越来越大,超过Integer的表示范围而溢出成为负数。

  1. 禁止使用构造方法BigDecimal(double)的方式把double值转化为BigDecimal对象。

说明∶BigDecimal(double)存在精度损失风险,在精确计算或值比较的场景中可能会导致业务逻辑异常。如:BigDecimal g = new BigDecimal(0.1F);实际的存储值为∶0.10000000149

正例:优先推荐入参为String 的构造方法,或使用BigDecimal的valueOf方法,此方法内部其实执行了Double的toString ,而 Double的toString 按double的实际能表达的精度对尾数进行了截断。

BigDecimal recommend1 = new BigDecimal("0.1");

BigDecimal recommend2 = BigDecimal.valueOf(0.1);

  1. 关于基本数据类型与包装数据类型的使用标准如下:

1)所有的POJO类属性必须使用包装数据类型。

2)RPC方法的返回值和参数必须使用包装数据类型。

(五)日期时间

  1. 日期格式化时,传入pattern中表示年份统一使用小写的y。

说明∶日期格式化时,yyyy表示当天所在的年,而大写的YYYY代表是week in which year ( JDK7之后引入的概念),意思是当天所在的周属于的年份,一周从周日开始,周六结束,只要本周跨年,返回的YYYY就是下一年。

正例:表示日期和时间的格式如下所示︰

new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")

  1. 区分M---月份;m---分钟;H---24小时制;12---12小时制

  1. 获取当前毫秒数:System.currentTimeMillis();

  1. 不允许在任何程序地方使用java.sql.Date, java.sql.Time, java.sql.Timestamp

  1. 不要在程序中写死一年为365天,避免在公历闰年时出现日期转换错误或程序逻辑错误

正例:
//获取今年的天数

int daysOfThisYear = LocalDate.now().lengthOfYear();
/获取指定某年的天数
LocalDate.of(2011,1,1).lengthOfYear();

(六)集合处理

  1. 重写equals方法必须重写hashCode方法。

  1. 判断集合内部的元素是否为空,使用isEmpty()方法

(七)并发处理

  1. 获取单例类需要保证线程安全,其中的方法也要保证线程安全(synchronized)

  1. 创建线程或线程池是指定有意义的线程名称

(八)控制语句

  1. 在switch块内,每个case都可以通过continue/break/return来终止,要么注释说明程序将执行到哪个case;

在一个switch内,必须包含一个default语句。

注意:break是退出switch语句块,而return是退出方法体。

  1. 当switch括号内的变量类型为String并且此变量为外部参数时,必须先进行null判断。

  1. 在if/else/for/while/do语句中必须使用大括号。

(九)注释规约

  1. 类、类属性、类方法的注释必须使用Javadoc规范,使用/**内容*/格式,不得使用// xxx方式。

  1. 抽象方法必须用javadoc注释,指明返回值,参数,异常,方法做什么事情,实现什么功能

  1. 所有的类必须添加创建者和日期

  1. 方法内部单行注释,在备注语句上方另起一行,使用//注释。

  1. 所有的枚举类型字段必须要有注释,说明每个数据项的用途。

(十)前后端规约

  1. 前后端交互的APl,需要明确协议、域名、路径、请求方法、请求内容、状态码、响应体。

  1. 前后端数据列表相关的接口返回,如果为空,则返回空数组[]或空集合f。

  1. 服务端发生错误时,返回给前端的响应信息必须包含HTTP状态码,errorCode.errorMessage、用户提示信息四个部分。

  1. 在前后端交互的JSON格式数据中,所有的key必须为小写字母开始的lowerCamelCase风格,符合英文表达习惯,且表意完整。

  1. 对于需要使用超大整数的场景,服务端一律使用String字符串类型返回,禁止使用Long类型。

  1. HTTP请求通过URL传递参数时,不能超过2048字节。

你可能感兴趣的:(代码规范)