一、java代码规范
(一)、命名风格
1、类名使用UpperCamelCase风格,必须遵从驼峰形式,但以下情形例外:DO / BO / DTO / VO / AO
正例:MarcoPolo / UserDO / XmlService / TcpUdpDeal / TaPromotion
反例:macroPolo / UserDo / XMLService / TCPUDPDeal / TAPromotion
2、方法名、参数名、成员变量、局部变量都统一使用lowerCamelCase风格,必须遵从驼峰形式。
正例: localValue / getHttpMessage() / inputUserId
3、常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。
正例:MAX_STOCK_COUNT
反例:MAX_COUNT
4、抽象类命名使用Abstract或Base开头;异常类命名使用Exception结尾;测试类命名以它要测试的类的名称开始,以Test结尾。
5、POJO类中布尔类型的变量,都不要加is,否则部分框架解析会引起序列化错误。
6、包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用单数形式,但是类名如果有复数含义,类名可以使用复数形式
正例: 应用工具类包名为com.aia.glory.common,类名为StringUtils(此规则参考spring的框架结构)
7、如果模块、接口、类、方法使用了设计模式,在命名时体现出具体模式。
说明:将设计模式体现在名字中,有利于阅读者快速理解架构设计理念。
正例:public class OrderFactory; public class LoginProxy; public class ResourceObserver;
8、Service曾接口的实现类使用接口类名加Impl方式
正例:CacheServiceImpl
9、枚举类名建议带上Enum后缀,枚举成员名称需要全大写,单词间用下划线隔开。
正例:枚举名字为ProcessStatusEnum的成员名称:SUCCESS / UNKOWN_REASON。
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的统称,禁止命名成xxxPOJO。
(二)常量定义
1、不允许任何魔法值(即未经定义的常量)直接出现在代码中。
反例:
String key ="id-task-" + id;
map.put(key, value);
if (a ==0) {
// do something
}
else if (a ==1) {
// do something
}
2、不要使用一个常量类维护所有常量,按常量功能进行归类,分开维护
正例:缓存相关常量放在类CacheConsts下;系统配置相关常量放在类ConfigConsts下。
(三)代码格式
1、采用4个空格缩进,禁止使用tab字符。
说明:如果使用 tab 缩进,必须设置 1 个 tab 为 4 个空格。 IDEA 设置 tab 为 4 个空格时,
请勿勾选 Use tab character ;而在 eclipse 中,必须勾选 insert spaces for tabs 。
2、单行代码长度不能超过120个字符
3、IDE的text file encoding设置为UTF-8
4、没有必要增加若干空格来使某一行的字符与上一行对应位置的字符对齐
5、必须设置类、方法注释模板,要求至少包含@author,@Description注释
6、不要在java文件里直接定义sql,sql统一维护在xml中,后期会使用mybatis generator生成dao层代码
7、查询操作和单条sql的update操作不需要添加@Transcational注解
(四)OOP规约
1、尽量不要使用可变参数编程
2、覆写方法,必须加@Override注解,过时方法必须加@Deprecated注解
3、Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用equals。
正例:"test".equals(object);
反例:object.equals("test");
4、包装类型的比较建议都使用equals比较
说明:对于Integer类型-128到127之间的范围已做了缓存,可以用==判断,但除非确认所有值都不超过这个范围,否则不要这样比较
5、各层之间数据对象的复制,禁止使用浅clone,尽量不使用直接set每个属性的方式。前者不安全后者重复代码量过大
(使用cglib beancopier clone bean)
6、在if/else/for/while/do语句中必须使用大括号。即使只有一行代码,避免采用单行的编码方式:if (condition) statements;
7、注意 Math.random() 这个方法返回是double类型,注意取值的范围 0≤x<1(能够取到零值,注意除零异常),如果想获取整数类型的随机数,不要将x放大10的若干倍然后取整,直接使用Random对象的nextInt或者nextLong方法
8、获取当前毫秒数System.currentTimeMillis(); 而不是new Date().getTime(); 说明:如果想获取更加精确的纳秒级时间值,使用System.nanoTime()的方式。在JDK8中,针对统计时间等场景,推荐使用Instant类。
9、尽量不要再controller层写过多的业务逻辑,业务逻辑都写在service层
(五)异常处理
1、对trace/debug/info级别的日志输出,必须使用条件输出形式或者使用占位符的方式。
说明:logger.debug("Processing trade with id: " + id + " and symbol: " + symbol); 如果日志级别是warn,上述日志不会打印,但是会执行字符串拼接操作,
如果symbol是对象,会执行toString()方法,浪费了系统资源,执行了上述操作,最终日志却没有打印。
正例:(条件)
if (logger.isDebugEnabled()) {
logger.debug("Processing trade with id: " + id + " and symbol: " + symbol);
}
正例:(占位符)
logger.debug("Processing trade with id: {} and symbol : {} ", id, symbol);
2、异常信息应该包括两类信息:案发现场信息和异常堆栈信息。如果不处理,那么通过关键字throws往上抛出。
正例:logger.error(各类参数或者对象toString + "_" + e.getMessage(), e);
(六)并发控制
1、SimpleDateFormat 是线程不安全的类,一般不要定义为static变量,如果定义为static,必须加锁,或者使用DateUtils工具类。
正例:注意线程安全,使用DateUtils。
亦推荐如下处理:
private static final ThreadLocal df = new ThreadLocal<DateFormat>() {
@Override
protected DateFormat initialValue() {
return new SimpleDateFormat("yyyy-MM-dd");
}
};
说明:如果是JDK8的应用,可以使用Instant代替Date,LocalDateTime代替Calendar,DateTimeFormatter代替SimpleDateFormat,
官方给出的解释:simple beautiful strong immutable thread-safe。
------
二、数据库规范
(一)建表规范
1、表名、字段名尽量使用小写字母或数字,禁止出现数字开头,如果表名或字段名由多个独立意义的单词组成中间应以“_”分割
好处:
(1)便于快速理解表或字段含义(写一串字母谁知道有几个意思,目前来看我们数据库就是不分割的一串字母)
(2)Mybatis自动生成数据库字段和实体对应关系时方便自动转为驼峰方式
2、禁用sql保留字
如:ADD,EXCEPT,PERCENT,ALL,EXEC,PLAN,ALTER,EXECUTE
3、尽量为表设置主键,主键索引名为pk_字段名;唯一索引名为uk_字段名;普通索引名则为idx_字段名
4、表设计必备字段create_time, create_user, update_time, update_user
5、字段必须添加描述信息方便别人理解
6、varchar和nvarchar都可以存储变长字符,一般对于可能用到中文、韩文、日文等本地语言字符的字段需要使用nvarchar存储,
如果只是英文和数字的使用varchar即可。
注意: varchar和nvarchar存储的都是实际字符长度而不是字节长度。
举例:如code,flag这种不可能引入本地语言的的字段用varchar
name, description等考虑国际化建议使用nvarchar
----------
(二)索引规范
1、业务上有唯一意义的字段,即使是多个字段的组合也建成唯一索引
2、尽量不要做多个表join操作,尤其是大表的join
(四)ORM映射
1、禁用select * 即使你要查询所有列
2、禁止在mybatis xml中使用${参数},只允许使用#{参数}
$会产生sql注入
-----
三、代码提交规范
(一)git commit
1、git commit时必须添加提交备注
-----
type: feat(新功能)/fix(修复问题)/refactor(重构)/test(增加测试代码)
taskId: PTPHDMSP-1288(jira里task id)
subject:提交描述,如果提交内容比较多可以是多行
-------
举例:
type: fix
taskId: PTPHDMSP-1288
subject: 解决smoke环境子渠道无法显示问题
网友评论