这是我从阿里巴巴的java规范文档提取的一些内容,主要适用于我这种底层程序员。推荐大家去看这个文档《阿里巴巴java开发手册》。另外配套的还有阿里的java规范扫描插件:plugin(https://p3c.alibaba.com/plugin/eclipse/update),推荐大家去下载。
Java规范
1.命名规范
1.类名可以多个大写的
领域模型命名规约
1) 数据对象:xxxDO,xxx 即为数据表名
2) 数据传输对象:xxxDTO,xxx 为业务领域相关的名称
3) 展示对象:xxxVO,xxx 一般为网页名称
4) POJO 是 DO/DTO/BO/VO 的统称,禁止命名成 xxxPOJO
- pojo类的数据类型前头不要加is,防止rpc框架反向解析出错
- pojo类中添加toString方法,便于排查问题
- 类内方法定义顺序依次是:公有方法或保护方法 > 私有方法 > getter/setter
方法
2.常量格式
大写+下划线隔开:MAX_STOCK_COUNT
3.特殊类
- 抽象类命名使用 Abstract 或 Base 开头;
- 异常类命名使用 Exception 结尾;
- 测试类命名以它要测试的类的名称开始,以 Test 结尾
4.数组格式
方括号放在前面:String[] args
5.设计模式
类名中添加具体模式
public class OrderFactory;
public class LoginProxy;
6.接口定义
- 接口方法签名:void f();
不要加任何修饰符号,例如:public abstract - 接口基础常量表示:String COMPANY = “alibaba”;
7.接口实现类命名
- Service 和 DAO 类,用 Impl 的后缀与接口区别:
CacheServiceImpl 实现 CacheService 接口 - 是形容能力的接口名称,取对应的形容词做接口名:
AbstractTranslator 实现 Translatable接口
8.枚举
- 枚举名字后面添加Enum:DealStatusEnum
- 成员名称全大写:SUCCESS / UNKOWN_REASON
9.各层命名
Service/DAO 层方法命名规约:
1) 获取单个对象的方法用 get 做前缀。
2) 获取多个对象的方法用 list 做前缀。
3) 获取统计值的方法用 count 做前缀。
4) 插入的方法用 save(推荐)或 insert 做前缀。
5) 删除的方法用 remove(推荐)或 delete 做前缀。
6) 修改的方法用 update 做前缀。
2.结构
1.常量类
- 常量类按常量功能进行归类,分开维护。
2.运算符
- 任何运算符左右必须加一个空格。
说明:运算符包括赋值运算符=、逻辑运算符&&、加减乘除符号、三目运算符等。
3.保留字的括号
保留字与括号之间需要空格
if/for/while/switch/do 等保留字与左右括号之间都必须加空格。
if (flag == 1) { ...
4.文字过长换行
- 超过120字符换行,第二行缩进4个空格,第三行保持一样缩进即可
- 点符号换行
- 括号,逗号前不换行
- 多个参数,逗号后面加空格
method("a", "b", "c");
- 一个空行隔离不同语义组别
5.OOP规范
- 重写方法上面添加:@Override 注解
- 接口过时:添加@Deprecated 注解,并说明采用的新接口是什么
(不能使用过时接口) - equals的使用:
"test".equals(object);
,反过来可能导致空指针异常 - 构造方法:只用来放置初始化逻辑,业务逻辑禁止放进去
- 字符串的连接方式,使用 StringBuilder 的 append 方法进行扩展
- 访问控制尽量从严:
- 1) 如果不允许外部直接通过 new 来创建对象,那么构造方法必须是 private。
- 2) 工具类不允许有 public 或 default 构造方法。
- 3) 类非 static 成员变量并且与子类共享,必须是 protected。
- 4) 类非 static 成员变量并且仅在本类使用,必须是 private。
- 5) 类 static 成员变量如果仅在本类使用,必须是 private。
- 6) 若是 static 成员变量,必须考虑是否为 final。
- 7) 类成员方法只供类内部调用,必须是 private。
- 8) 类成员方法只对继承类公开,那么限制为 protected。
- 后台传数据前台显示,使用¥ !{var} , 当数据不存在,前台会显示 ¥{var}
(¥替换成美元符号)
6.逻辑
- 尽量少使用if..else,而是使用:
if (condition) {
...
return obj;
}
// 接着写 else 的业务逻辑代码;
使用else if勿超过三层,超过使用状态设计模式
2. 将复杂判断赋值给一个boolean变量,不要在表达式中执行
//伪代码如下
boolean existed = (file.open(fileName, "w") != null) && (...) || (...);
if (existed) {
...
}
3.注释
- 类(+创建者信息)、类属性、类方法使用javadoc规范:/* * 内容 * */ ,可以悬停查看提示方法
- 抽象方法使用 javadoc注释,注释内容:返回值,参数,异常,功能,注意事项
- 方法内部代码上用 //注释 ,多行使用 /* 注释 */ 方式 ,与代码对齐
- 注释代码:1.后续恢复:加说明 2.不使用:最好删除掉(仓库已有)
- javadoc用于特殊标注:
【待办】TODO /【错误】FIXME +标记人+标记时间+预计处理时间
经常扫描清理此类标记
4.异常日志
1.异常
- 明确的异常用代码检查进行规范,不要进行捕捉
正例:if (obj != null) {...}
- 只捕捉非稳定代码
- 产生异常要么处理,要么抛出给调用者,不要单纯捕捉
- 事务代码中捕捉到异常要回滚事务
5.sql规范
- 字段名字
主键索引名为 pk_字段名;唯一索引名为 uk_字段名;普通索引名则为 idx_字段名 - 类型
小数类型用decimal
varchar长度>5000,使用text,独立表,防止影响效率 - 必备字段
id:unsigned bigint类型
gmt_create & gmt_modified:date_time类型 创建,修改时间 - 命名
- “业务名称_表的作用” : tiger_task / tiger_reader
- 库名与应用名一致
- 添加字段注释
- 规定
- 适当的字符存储长度提高检索速度