阿里java开发规范学习笔记 (三)代码格式 (四)OOP规范

阿里java开发规范:

本规范给出了范例,便于理解

结合自己在项目中的体会【】,谈一谈目前在项目中未能遵守的规范带来的麻烦和遵守了带来的方便之处。

(三) 代码格式

1. 【强制】大括号的使用约定。如果是大括号内为空,则简洁地写成{}即可,不需要换行;如果是非空代码块则: 
1) 左大括号前不换行。 
2) 左大括号后换行。 
3) 右大括号前换行。 
4) 右大括号后还有else等代码则不换行;表示终止的右大括号后必须换行。
【在阿里内部 换行括号党被征服了...目前大家都习惯左大括号不换行】


6. 【强制】注释的双斜线与注释内容之间有且仅有一个空格。
正例:// 注释内容,注意在//和注释内容之间有一个空格。
【一直在纠结1个空格好看还是不要空格好看还是2个空格好看,纠结的如同前面这句话一样混乱,之后可以不用纠结了】


7. 【强制】单行字符数限不超过 120 个,超出需要换行时 个,超出需要换行时 遵循如下原则: 
1) 第二行相对一缩进 4个空格,从第三行开始不再继续缩进参考示例。
 2) 运算符与下文一起换行。 
 3) 方法调用的点符号与下文一起换行。 
 4) 方法调用时,多个参数,需要换行时,在逗号后进行。 
 5) 在括号前不要换行,见反例。
 正例:
StringBuffer sb = new StringBuffer();
// 超过120个字符的情况下,换行缩进4个空格,点号和方法名称一起换行
sb.append("zi").append("xin")...
.append("huang")...
.append("huang")...
.append("huang");
【现在遵守的120字符,在宽屏下基本能看完一行,而且基本满足了大多数情况不会超过120,如果超了120除了定义的常量名字或者类名
太长导致外,其他情况都可以做优化,例如函数传参太多等。调用x.xx().xx().xxx().xxx()太长明显可拆,而且应该拆等情况。
多个参数,逗号后换行
操作符换行
下一行缩进4个空格】


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


【没有必要插入多个空行进行隔开。语音这个区分,根据每个人有不同的认为,但是好的分行可以看清思路和分块】


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


【过时的接口,暂时保留的应该加上@Deprecated注解,现有工程的接口描述 还可以更进一步(时间充裕可以优化)】


7. 【强制】所有的相同类型的包装类对象之间值的比较,全部使用equals方法比较。 说明:对于Integer var = ? 
在-128至127范围内的赋值,Integer对象是在IntegerCache.cache产生,会复用已有对象,这
个区间内的Integer值可以直接使用==进行判断,
但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用equals方法进行判断。


【涨知识了 超过2的8次方的数,都用equals进行对象比较。】


8. 关于基本数据类型与包装数据类型的使用标准如下: 
1) 【强制】所有的POJO类属性必须使用包装数据类型。 
2) 【强制】RPC方法的返回值和参数必须使用包装数据类型。 
3) 【推荐】所有的局部变量使用基本数据类型。 说明:POJO类属性没有初值是提醒使用者在需要使用时,必须自己显式地进行赋值,任何NPE问题,或者入库检查,都由使用者来保证。 
正例:数据库的查询结果可能是null,因为自动拆箱,用基本数据类型接收有NPE风险。 
反例:比如显示成交总额涨跌情况,即正负x%,x为基本数据类型,调用的RPC服务,调用不成功时,返回的是默认值,页面显示为0%,
这是不合理的,应该显示成中划线。所以包装数据类型的null值,能够表示额外的信息,如:远程调用失败,异常退出。


【现有工程的传输的类属性都没有采用包装数据类型,从数据库中返回的信息也采用是基本类型,所以不会有NPE(NullPointerException),
但是带来的坏处就是入库和从数据库读取的数据由于采用默认的int类型等,本应该显示null的数据会默认成0,(目前工程要改动这个,改动太大,风险太高)】


9. 【强制】定义DO/DTO/VO等POJO类时,不要设定任何属性默认值。 
反例:POJO类的gmtCreate默认值为new Date();
但是这个属性在数据提取时并没有置入具体值,在更新其它字段时又附带更新了此字段,导致创建时间被修改成当前时间。


【不设定默认值,特别是数据库的DO,从而保证你控制每条数据的值进行入库前的确认,被调用方进行检测】


10. 【强制】序列化类新增属性时,请不要修改serialVersionUID字段,避免反序列失败;如果完全不兼容升级,避免反序列化混乱,那么请修改serialVersionUID值。
说明:注意serialVersionUID不一致会抛出序列化运行时异常。
【当时查这个问题很久,原来是客户端和服务端的序列化号不同,另外java虚拟机识别这个号进行反序列化时,会有环境问题也会导致反序列化失败】


11. 【强制】构造方法里面禁止加入任何业务逻辑,如果有初始化逻辑,请放在init方法中。
16. 【推荐】setter方法中,参数名称与类成员变量名称一致,this.成员名 = 参数名。在getter/setter方法中,不要增加业务逻辑,增加排查问题的难度。 反例:


【只是用this.xx构造赋值,最多是赋值的操作。参数校验等业务逻辑应该在set get 外再包一层,不应该放在构造器和set get方法内】


17. 【推荐】循环体内,字符串的连接方式,使用StringBuilder的append方法进行扩展。 说明:反编译出的字节码文件显示每次循环都会new出一个StringBuilder对象,然后进行append操作,最后通过toString方法返回String对象,造成内存资源浪费。
反例:
String str = "start";
for (int i = 0; i < 100; i++) {
str = str + "hello";
}
【一直喜欢使用字符串的 拼接 + 符号 而不使用StringBuilder 的 append方法,现在明白了两者差异】


18. 【推荐】final可以声明类、成员变量、方法、以及本地变量,下列情况使用final关键字: 1) 不允许被继承的类,如:String类。 2) 不允许修改引用的域对象,如:POJO类的域变量。 3) 不允许被重写的方法,如:POJO类的setter方法。 4) 不允许运行过程中重新赋值的局部变量。 5) 避免上下文重复使用一个变量,使用final描述可以强制重新定义一个变量,方便更好地进行重构。
19. 【推荐】慎用Object的clone方法来拷贝对象。 说明:对象的clone方法默认是浅拷贝,若想实现深拷贝需要重写clone方法实现属性对象的拷贝。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值