JavaIT技术小牛软件之家

《阿里巴巴Java开发手册》学习分享

2017-02-19  本文已影响3615人  拾壹北
轻松一刻
  持续学习分享,请关注 ~
  您喜欢的话请小手   点击喜欢 ~

/ 1 / 手册发布背景

1.作者:

阿里Java技术大牛

2.目的:

业界对Java代码的规范比较混乱,阿里巴巴希望通过Java开发手册给业界带来一个标准,促使整体行业代码规范水平得到提高,使Java开发更高效、更加容错、更加具有协作性,提升协作效率,提高代码质量,降低代码维护成本。

3.内容模块:

编程规约、异常日志规约、MYSQL规约、工程规约、安全规约五大块

4.标准化的必要性:

对软件来说,适当的规范和标准绝不是消灭代码内容的创造性、优雅性,而是限制过度个性化,以一种普遍认可的方式一起做事,降低故障率,提升协作效率。开发手册详细列举如何开发更加高效,更加容错,更加有协作性,力求知其然,更知其不然,结合正反例,提高代码质量。比如,异常日志处理时的各种不规范行为;集合转换的各种坑;创建线程池出现的等待队列OOM等。

5.个人感受:

(1)除了对Java编程做了规范以外,很多规约都是编程老手的经验之谈,也可以说是踩过的坑,是阿里系的Java的惨痛经验教训;
(2)对基本的规范就要进行硬性统一,更有利于团队协作,也有利于代码维护;
(3)对规约的原因进行研究,刨根问底,可以学习到一些不熟悉的知识点;比如: 使用HashMap,如果key是自定义的类,就必须重写hashcode()和equals()。

/ 2 / 手册目录

一、 编程规约

(一) 命名规约
(二) 常量定义
(三) 格式规约
(四) OOP 规约
(五) 集合处理 
(六) 并发处理
(七) 控制语句
(八) 注释规约
(九) 其它

二、异常日志

(一) 异常处理
(二) 日志规约

三、 MySQL 规约

(一) 建表规约
(二) 索引规约
(三) SQL 规约
(四) ORM 规约

四、工程规约

(一) 应用分层
(二) 二方库规约
(三) 服务器规约

五、安全规约

/ 2 / 学习笔记

这里摘录《手册》中提出的,但是没有接触过的规约;或者摘录接触过的,但是和《手册》中不一致的编程习惯。

1. 命名规约

如果使用到了设计模式,建议在类名中体现出具体模式
说明:将设计模式体现在名字中,有利于阅读者快速理解架构设计思想。 正例:public class OrderFactory; public class LoginProxy; public class ResourceObserver;
各层命名规约
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。
long 或者 Long 初始赋值时,必须使用大写的 L,不能是小写的 l,小写容易跟数字 1 混淆,造成误解
说明:Long a = 2l; 写的是数字的 21,还是 Long 型的 2?

2. 常量定义

不要使用一个常量类维护所有常量,应该按常量功能进行归类,分开维护。如:缓存 相关的常量放在类:CacheConsts 下;系统配置相关的常量放在类:ConfigConsts 下

3. 格式规约

大括号的使用约定。如果是大括号内为空,则简洁地写成{}即可,不需要换行
任何运算符左右必须加一个空格
说明:运算符包括赋值运算符=、逻辑运算符&&、加减乘除符号、三目运行符等。
代码块缩进 4 个空格,如果使用 tab 缩进,请设置成 1 个 tab 为 4 个空格
单行字符数限制不超过 120 个,超出需要换行

方法参数在定义和传入时,多个参数逗号后边必须加空格
正例:下例中实参的"a",后边必须要有一个空格。 method("a", "b", "c");
IDE 的 text file encoding 设置为 UTF-8; IDE 中文件的换行符使用 Unix 格式,不 要使用 windows 格式
Windows系统里面,每行结尾是 回车+换行(CR+LF),即“\r\n”Unix系统里,每行结尾只有 换行LF,即“\n”Mac系统里,每行结尾是 回车CR 即'\r'
**■ ** 方法体内的执行语句组、变量的定义语句组、不同的业务逻辑之间或者不同的语义之 间插入一个空行。相同业务逻辑和语义之间不需要插入空行。

4. OOP(Object Oriented Programming,面向对象编程)公约

**■ ** 关于基本数据类型与包装数据类型的使用标准如下:
1) 所有的 POJO 类(Plain Ordinary Java Objec,简单Java对象,实际就是普通JavaBeans,其中有一些属性及其getter setter方法的类
,没有业务逻辑)属性必须使用包装数据类型。
初值问题?

2) RPC 方法的返回值和参数必须使用包装数据类型。
有利于序列化?

正解:用基本数据类型接收有 NPE (Null Pointer Exception)风险,
举一个反例
:某业务的交易报表上显示成交总额涨跌情况,即正负 x%,x 为基本数据类型,调用的 RPC 服务,调用不成功时,返回的是默认值,页面显示:0%,这是不合理的,应该显示成中划 线-。所以包装数据类型的 null 值,能够表示额外的信息,如:远程调用失败,异常退出。

3) 所有的局部变量推荐使用基本数据类型。
**■ ** 构造方法里面禁止加入任何业务逻辑,如果有初始化逻辑,请放在 init 方法中
**■ ** POJO 类必须写 toString 方法
在方法执行抛出异常时,可以直接调用 POJO 的 toString()方法打印其属性值,便于排 查问题。
**■ ** 使用索引访问用 String 的 split 方法得到的数组时,需做最后一个分隔符后有无内 容的检查,否则会有抛 IndexOutOfBoundsException 的风险
绝对是踩过坑的!

5. 集合处理

**■ ** Map/Set 的 key 为自定义对象时,必须重写 hashCode 和 equals。
原因:使用HashMap,如果key是自定义的类,就必须重写hashcode()和equals()。
正例:String 重写了 hashCode 和 equals 方法,所以我们可以非常愉快地使用 String 对象作 为 key 来使用。

■ ArrayList 的 subList 结果不可强转成 ArrayList,否则会抛出 ClassCastException 异常:java.util.RandomAccessSubList cannot be cast to java.util.ArrayList ;
说明:subList 返回的是 ArrayList 的内部类 SubList,并不是 ArrayList ,而是 ArrayList 的一个视图,对于 SubList 子列表的所有操作最终会反映到原列表上。

**■ ** 使用工具类 Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法, 它的 add/remove/clear 方法会抛出 UnsupportedOperationException 异常。
说明:asList 的返回对象是一个 Arrays 内部类,并没有实现集合的修改方法。Arrays.asList 体现的是适配器模式,只是转换接口,后台的数据仍是数组。
String[] str = new String[] { "a", "b" };
List list = Arrays.asList(str);
// 第一种情况:list.add("c"); 运行时异常。 第二种情况:str[0]= "gujin"; 那么 list.get(0)也会随之修改。

**■ ** 高度注意 Map 类集合 K/V 能不能存储 null 值的情况,如下表格

**■ ** 利用 Set 元素唯一的特性,可以快速对另一个集合进行去重操作,避免使用 List 的 contains 方法进行遍历去重操作。

5. 并发处理
参考文献:

[1] 【Java编码规范】《阿里巴巴Java开发手册(正式版)》发布!
[2] 阿里巴巴Java开发手册(正式版)

上一篇下一篇

猜你喜欢

热点阅读