# (一) 代码命名风格

# 1, 方法名、参数名、成员变量、局部变量都统一使用驼峰命名

# 2, 常量命名全部大写,单词间用下划线隔开

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

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

# 5, 包名统一使用小写

# 6, 枚举类名带上 Enum 后缀,枚举成员名称需要全大写,单词间用下划线隔开。

# 7, Service/DAO 层方法命名规约

#

1) 获取单个对象的方法用 get 做前缀。

2) 获取多个对象的方法用 list 做前缀,复数结尾,如:listObjects。

3) 获取统计值的方法用 count 做前缀。

4) 插入的方法用 save/insert 做前缀。

5) 删除的方法用 remove/delete 做前缀。 6) 修改的方法用 update 做前缀。

# (二) 代码格式

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

# 2. 采用 4 个空格缩进或者使用球4个空格 Tab 字符。

# 3. 注释的双斜线与注释内容之间有且仅有一个空格。

# 4. 方法参数在定义和传入时,多个参数逗号后面必须加空格。

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

# 6. 单个方法的总行数不超过 80 行。

# 7. 表达异常的分支时,少用 if-else 方式,这种方式可以改写成:

if (condition) {

...

return obj;

}

# 接着写 else 的业务逻辑代码;

注意

如果非使用 if()...else if()...else...方式表达逻辑,避免后续代码维护困难,请勿超过 3 层。

# (三) OOP 规范

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

创建规则

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

说明

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

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

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

# 4. 浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用 equals来判断。推荐使用BigDecimal来进行浮点数的运算。

# 5. 禁止使用构造方法 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);

# 6. 所有的 POJO 类属性必须使用包装数据类型,RPC 方法的返回值和参数必须使用包装数据类型,所有的局部变量使用基本数据类型。

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

# 9. 使用工具类 Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,它的 add/remove/clear 方法会抛出 UnsupportedOperationException 异常。

# 10. 线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。

# 11. SimpleDateFormat 是线程不安全的类,一般不要定义为 static 变量,如果定义为 static,必须加锁,或者使用 DateUtils 工具类。

# 12. 必须回收自定义的 ThreadLocal 变量,尤其在线程池场景下,线程经常会被复用,如果不清理自定义的 ThreadLocal 变量,可能会影响后续业务逻辑和造成内存泄露等问题。尽量在代理中使用 try-finally 块进行回收。

# 二、MySQL 规范

# (一) 建表规范

# 1. 表达是与否概念的字段,必须使用 is_xxx 的方式命名,数据类型是 unsigned tinyint(1 表示是,0 表示否)。

说明

任何字段如果为非负数,必须是 unsigned。 注意:POJO 类中的任何布尔类型的变量,都不要加 is 前缀,所以,需要在<resultMap>设置从 is_xxx 到 Xxx 的映射关系。数据库表示是与否的值,使用 tinyint 类型,坚持 is_xxx 的命名方式是为了明确其取值含义与取值范围。

正例

表达逻辑删除的字段名 is_deleted,1 表示删除,0 表示未删除。

# 2. 表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只出现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑。说明:MySQL 在 Windows 下不区分大小写,但在 Linux 下默认是区分大小写。因此,数据库名、表名、字段名,都不允许出现任何大写字母,避免节外生枝。

正例

aliyun_admin,rdc_config,level3_name反例:AliyunAdmin,rdcConfig,level_3_name

# 3. 禁用保留字,如 desc、range、match、delayed 等,请参考 MySQL 官方保留字。

# (二) 索引规范

# 1. 业务上具有唯一特性的字段,即使是组合字段,也必须建成唯一索引。

# 2. 超过三个表禁止 join。需要 join 的字段,数据类型保持绝对一致;多表关联查询时,保证被关联的字段需要有索引。

# 3. 在 varchar 字段上建立索引时,必须指定索引长度,没必要对全字段建立索引,根据实际文本区分度决定索引长度。

# (三) SQL 语句规范

# 1. 不要使用 count(列名)或 count(常量)来替代 count(),count()是 SQL92 定义的标准统计行数的语法,跟数据库无关,跟 NULL 和非 NULL 无关。

说明

count(*)会统计值为 NULL 的行,而 count(列名)不会统计此列为 NULL 值的行。

# 2. 不得使用外键与级联,一切外键概念必须在应用层解决。

# (四) ORM 映射规范

# 1. 不要用 resultClass 当返回参数,即使所有类属性名与数据库字段一一对应,也需要定义<resultMap> ;反过来,每一个表也必然有一个<resultMap>与之对应。

说明

配置映射关系,使字段与 DO 类解耦,方便维护。

# 2. sql.xml 配置参数使用:#{},#param# 不要使用${} 此种方式容易出现 SQL 注入。

# (五)、代码自查

使用阿里巴巴Java开发手册的IDEA插件。

安装及使用方法:https://developer.aliyun.com/article/224817 (opens new window)