整理《阿里巴巴Java开发手册》常用的编码规约

时间:2021-03-26 03:26:57

1、抽象类命名使用Abstract或Base开头;异常类命名使用Exception结尾;测试类命名以它要测试的类的名称开始,以Test结尾。
2、中括号是数组类型的一部分,数组定义如下:String[] args;
3、POJO类中布尔类型的变量,都不要加is,否则部分框架解析会引起序列化错误。
4、包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用单数形式,但是类名如果有复数含义,类名可以使用复数形式。
5、如果使用到了设计模式,建议在类名中体现出具体模式。
6、接口类中的方法和属性不要加任何修饰符号(public 也不要加),保持代码的简洁性,并加上有效的Javadoc注释。尽量不要在接口里定义变量,如果一定要定义变量,肯定是与接口方法相关,并且是整个应用的基础常量。
7、对于Service和DAO类,基于SOA的理念,暴露出来的服务一定是接口,内部的实现类用Impl的后缀与接口区别。
8、枚举类名建议带上Enum后缀,枚举成员名称需要全大写,单词间用下划线隔开。
9、各层命名规约:
   A) Service/DAO层方法命名规约
     1) 获取单个对象的方法用get做前缀。
     2) 获取多个对象的方法用list做前缀。
     3) 获取统计值的方法用count做前缀。
     4) 插入的方法用save(推荐)或insert做前缀。
     5) 删除的方法用remove(推荐)或delete做前缀。
     6) 修改的方法用update做前缀。
   B) 领域模型命名规约
     1) 数据对象:xxxDO,xxx即为数据表名。
     2) 数据传输对象:xxxDTO,xxx为业务领域相关的名称。
     3) 展示对象:xxxVO,xxx一般为网页名称。
     4) POJO是DO/DTO/BO/VO的统称,禁止命名成xxxPOJO。

10、long或者Long初始赋值时,必须使用大写的L,不能是小写的l,小写容易跟数字1混淆,造成误解。
11、常量的复用层次有五层:跨应用共享常量、应用内共享常量、子工程内共享常量、包内共享常量、类内共享常量。
     1) 跨应用共享常量:放置在二方库中,通常是client.jar中的constant目录下。
     2) 应用内共享常量:放置在一方库的modules中的constant目录下。

12、if/for/while/switch/do等保留字与左右括号之间都必须加空格。
13、任何运算符左右必须加一个空格。
14、缩进采用4个空格,禁止使用tab字符。
15、单行字符数限制不超过120个,超出需要换行,换行时遵循如下原则:
     1)第二行相对第一行缩进4个空格,从第三行开始,不再继续缩进,参考示例。
     2) 运算符与下文一起换行。
     3) 方法调用的点符号与下文一起换行。
     4) 在多个参数超长,逗号后进行换行。
     5) 在括号前不要换行,

16、方法参数在定义和传入时,多个参数逗号后边必须加空格。
     method(“a”, “b”, “c”);
17、IDE的text file encoding设置为UTF-8; IDE中文件的换行符使用Unix格式,不要使用windows格式。
18、避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成本,直接用类名来访问即可。
19、所有的覆写方法,必须加@Override注解。
20、不能使用过时的类或方法。
21、Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用equals。 正例: “test”.equals(object);
22、所有的相同类型的包装类对象之间值的比较,全部使用equals方法比较
23、关于基本数据类型与包装数据类型的使用标准如下:
     1) 【强制】所有的POJO类属性必须使用包装数据类型。
     2) 【强制】RPC方法的返回值和参数必须使用包装数据类型。
     3) 【推荐】所有的局部变量使用基本数据类型。

24、定义DO/DTO/VO等POJO类时,不要设定任何属性默认值。
25、序列化类新增属性时,请不要修改serialVersionUID字段,避免反序列失败;如果完全不兼容升级,避免反序列化混乱,那么请修改serialVersionUID值。
26、构造方法里面禁止加入任何业务逻辑,如果有初始化逻辑,请放在init方法中。
27、POJO类必须写toString方法。使用IDE的中工具:source> generate toString时,如果继承了另一个POJO类,注意在前面加一下super.toString。
28、使用索引访问用String的split方法得到的数组时,需做最后一个分隔符后有无内容的检查,否则会有抛IndexOutOfBoundsException的风险。
29、 类内方法定义顺序依次是:公有方法或保护方法 > 私有方法 > getter/setter方法。
30、下列情况,声明成final会更有提示性:
     1) 不需要重新赋值的变量,包括类属性、局部变量。
     2) 对象参数前加final,表示不允许修改引用的指向。
     3) 类方法确定不允许被重写。

31、类成员与方法访问控制从严:
     1) 如果不允许外部直接通过new来创建对象,那么构造方法必须是private。
     2) 工具类不允许有public或default构造方法。
     3) 类非static成员变量并且与子类共享,必须是protected。
     4) 类非static成员变量并且仅在本类使用,必须是private。
     5) 类static成员变量如果仅在本类使用,必须是private。
     6) 若是static成员变量,必须考虑是否为final。
     7) 类成员方法只供类内部调用,必须是private。
     8) 类成员方法只对继承类公开,那么限制为protected。

32、关于hashCode和equals的处理,遵循如下规则:
     1) 只要重写equals,就必须重写hashCode。
     2) 因为Set存储的是不重复的对象,依据hashCode和equals进行判断,所以Set存储的对象必须重写这两个方法。
     3) 如果自定义对象做为Map的键,那么必须重写hashCode和equals。
33、不要在foreach循环里进行元素的remove/add操作。remove元素请使用Iterator方式,如果并发操作,需要对Iterator对象加锁。