阿里巴巴开发手册学习笔记

一、命名风格:

1、【强制】类名使用UpperCameCase风格,必须遵从驼峰形式,但以下情形例外:DO/BO/DTO/VO/AO

正例:UserDO
反例:UserDo
2、【强制】常量命名全部大写,单词间用下划线隔开,力求语义完整表达清楚,不要嫌名字长。
正例:MAX_STOCK_COUNT
反例:MAX_COUNT
3、【强制】抽象类命名使用Abstract或者Base开头;异常类命名使用Exception结尾;测试类命名以他要测试的类的名称开始,以Test结尾。
4、【强制】数组定义:String [] args;
5、【强制】POJO类中布尔类型的变量,都不要加is,否则部分框架解析会引起序列化错误。
6、【强制】包名统一使用小写,点分隔符之间有且仅有一个自然语义的英文单词。包名统一使用单数形式,但是类名如果有复数含义,类名可以使用复数形式。
7、【强制】如果使用到了设计模式,建议在类名中体现出具体模式。说明:将设计模式体现在名字中,有利于阅读者快速理解架构设计思想。
正例:public class OrderFactory;
      public class LoginProxy;
8、【推荐】接口类的方法和属性不要加任何修饰符号(public也不要加),保持代码的简洁性,并加上有效的Javadoc注释。尽量不要在接口里定义变量。如果一定要定义变量,肯定与接口方法有关,并且是整个应用的基础常量。
正例:接口方法名:void f(); 
接口基础常量表示:String COMPANY ="alibaba";
反例:接口方法定义:public abstract void f();
说明:JDK8中接口默认实现,那么这个default方法,是对所有实现类都有价值的默认实现。
9、接口和实现类的命名有两套规则:
(1)【强制】对于Service和Dao类,基于SOA的理念,暴露出来的服务一定是接口,内部的实现类用Impl的后缀与接口区别。
正例:CacheServiceImpl实现CacheService接口。
(2)【推荐】如果是形容能力的接口名称,取对应的形容词做接口名(通常是-able的形式)。
正例:AbstractTranslator实现Translatable.
10、【参考】各层命名规约:
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的统称,禁止命名成xxxPOJ。

二、常量定义

1、【强制】long或者Long初始赋值时,必须使用大写的L,不能是小写的l,小写容易跟数字1混淆,造成误解。
2、【推荐】不要使用一个常量类维护所有常量,应该按常量功能进行归类,分开维护。如:缓存相关的常量放在类CacheConsts下:系统配置相关的常量放在类:ConfigConsts下。
说明:大而全的常量类,非得使用查找功能才能定位到修改的常量,不利于理解和维护。
三、代码格式

1、【强制】if/for/while/switch/do等保留字与括号之间都必须加空格。
2、【强制】任何二目、三目运算符的左右两边都需要加一个空格。
3、【强制】缩进采用4个空格,禁止使用tab字符。
说明:如果使用tab缩进,必须设置1个tab为4个空格。IDEA设置tab为4个空格时,请勿勾选Use tab character;而在eclipse中,必须勾选inseret spaces for tabs
4、【强制】单行字符数限制不查过120个,超过需要换行,换行时遵循如下原则:
(1)第二行相对第一行缩进4个空格,从第三行开始,不在进行缩进,参考正例。
(2)运算符与下文一起换行。
(3)方法调用的点符号与下文一起换行。
(4)在多个参数超长,在逗号后换行。
(5)在括号前不要换行
正例:
     String sb = new StringBuffer();
     sb.append("zi").append("xin")...
         . append("huang")...
         . append("huang")...
         . append("huang");
5、【强制】方法参数在定义和传入时,多个参数逗号后边必须加空格。
正例:下例中实参的“a”,后边必须要有一个空格。
method("a","b","c");
6、【强制】IDE的text file encoding设置为UTF-8;IDE中文件的换行符使用Unix格式,不要使用windows格式。

7、【推荐】方法体内的执行语句组、变量的定义语句组、不同的业务逻辑之间或者不同的语义之间插入一个空行。相同业务逻辑和语义之间不需要插入空行。

四、OOP规约

1、【强制】避免通过一个类的对象引用访问此类的静态变量或静态方法,不避免的话则会增加编译器解析成本,直接用类名来访问即可。
2、【强制】所有的覆盖方法,必须加@override注解
3、【强制】相同参数类型,相同业务含义,才可以使用Java的可变参数,避免使用Object。
说明:可变参数必须放置在参数列表的最后。(提倡大家尽量不要用可变参数编程)
正例:public User getUsers(String type,Integer ... ids){...}
4、【强制】Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用equals。
正例:"tets".equals(object);
5、所有的相同类型的包装类对象之间的值的比较,全部使用equals方法比较。
说明:对于Integer var = ? 在-128至127范围内的赋值,Integer对象是在IntegerCache.chche产生,会复用已有对象,这个区间内的Integer值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大炕,推荐使用equals方法进行判断。
6、关于基本数据类型与包装数据类型的使用标准如下:
(1)【强制】所有的POJO类属性必须使用包装数据类型。
(2)【强制】RPC方法的返回值和参数必须使用包装数据类型。
(3)【推荐】所有的局部变量使用使用基本数据类型。
7、定义DO/DTO/VO等POJO类时,不要设定任何属性默认值
反例:POJO类的gmtCreate默认值为new Date();但是这个属性在提取时没有置入具体值,在更新其他字段时又附带更新了此字段,导致创建时间被修改成当前时间。
8、【强制】序列化类新增属性时,请不要修改servialVersionUID字段,避免反序列失败;如果完全不兼容升级,避免反序列化混乱,那么请修改serialVersionUID值。
说明:注意serialVersionUID不一致会抛出序列化运行时异常。
9、【强制】构造方法里面禁止加入任何业务逻辑,如果有初始化逻辑,请放在init方法中。
10、【强制】POJO类必须写toString方法,如果继承了另一个POJO类,注意在前面加一下super.toString。
说明:在方法执行抛出异常时,可以直接调用POJO的toString()方法打印其属性值,便于排查问题。
11、【推荐】索引访问用String的split方法得到的数组时,需做最后一个分隔符有无内容的检查,否则会有IndexOutOfBoundsException的风险。
说明:
String str="a,b,c,,";
String [] a=str.split(",");

System.out.println(a.length);  //预期结果大于3,实际输出结果为3

12、【推荐】类内方法定义顺序依次是:公有方法或保护方法>私有方法>getter/setter方法。
说明:公有方法是类的调用者和维护者最关心的方法,首屏展示最好;保护方法虽然只是子类关心,也可能是“模版设计模式”下的和核心方法;而私


有方法外部一般不需要特别关心,是一个黑盒实现;因为方法信息价值较低,所有Service和DAO的getter/setter方法放在类体最后。
13、循环体内,字符串的连接方式,使用StringBuffer的append方法进行扩展。
说明:反编译的字节码文件显示每次循环都会new出一个StringBuffer对象,然后进行append操作,最后通过toString方法返回String对象,造成资源浪费。
反例:
String str="start";
for(int i =0;i<100;i++){
    str = str + "hello";

}

14、【推荐】final可以声明类、成员变量、方法、以及本地变量,下列情况使用final关键字;
1)不允许被继承的类,如:String类。
2)不允许修改引用的域对象,如:POJO类的域变量。
3)不允许被重写的方法,如:pojo类的setter方法。
4)不允许运行过程中重新赋值的局部变量。

5)避免上下文重复使用一个变量,使用final描述可以重新定义一个变量,方便更好的进行重构。

15、【推荐】慎用Object的clone方法来拷贝对象

说明:对象的clone方法默认是浅拷贝,若想实现深拷贝需要重写clone方法实现属性的拷贝。

16、

猜你喜欢

转载自blog.csdn.net/Sun_of_Rainy/article/details/80815241