-
禁止使用Map、Pair、jsonObject等灵活对象作为参数传递和方法返回值。
-
框架的BaseResopnse 禁止带入service层。
-
rest层禁止写业务逻辑,逻辑请放入service层。
-
禁止使用Lombok的 @Data注解 因为生成的toString Equaus hashcode 不会考虑父类,也会覆盖掉你重写的方法。
-
禁止对整个类进行格式化,如果需要格式化,值格式化选中的一小部分代码即可,避免冲突。
-
get和set方法,禁止加业务逻辑,增加排查难度。
-
变量名需要和含义匹配,不能出现 a b str1 str2 这种无异议变量名。
-
变量名要和类型不能不匹配,比如定义一个Map 却命名list。
-
变量名不要以is开头,也不能下划线,特殊字符开头。
-
TODO记得要解决,不能带上线。
-
不允许任何魔法值(即未经预先定义的常量)直接出现在代码中,如
String s =”a”;
-
字符串拼接时,使用StringBuilder ,不要使用StringBuffer。
-
类不超过一千行。
-
方法体不超过一屏。
-
循环或者if嵌套不超过三层。
-
多条件排序 不允许使用 Comparator.comparing(类::属性一).reversed(); BIGDECIMAL 降序不支持; 推荐使用 Comparator.comparing(类::属性一,Comparator.reverseOrder());
-
BigDecimal在new的时候必须用字符串,
new BigDecimal(“1”) 不要用 new BigDecimal(1)
-
BigDecimal变量使用toPlainString 来转换为字符串。
-
数字计算必须使用BigDecimal并指定保留小数位数。
-
涉及到金额拆分必须考虑最后一笔的精度尾差。
-
所有功能提测前必须经过代码走查和sonar扫描保证代码质量。
-
变量名必须驼峰首字母大写(除第一个字母)、方法必须首字母小写,多个单词用驼峰,类名首字母大写,常量全字母大写,单词用下划线连接。
-
成员变量必须private,有继承可以使用protected,禁止使用default作为修饰 。
-
合理分类和分包,同包的类 、或者同类的方法,必须有相关性,不能一个fund包里出现组合相关的类,一个分销信息的servcie类 出现了查询投顾信息的方法。
-
包名必须一个单词且全小写。
-
如果模块、接口、类、方法使用了设计模式,在命名时需体现出具体模式,如OrderFactory。
-
所有service必须有接口有实现类,注入的地方也必须使用接口注入, 禁止注入一个ServiceImpl类。
-
使用锁、分布式锁、文件流、必须有finally 释放,或使用1.7的try写法。
-
接口的实现类中的实现方法,必须加@Override 注解。
-
equals方法的枚举或者常量一定要放在左边避免空指针,或使用 java.util.Objects#equals。
-
switch一定要写default。
-
在 if/else/for/while/do 语句中必须使用大括号。即使只有一行。
-
如果这个方法或者这个类不建议使用,需要添加@Deprecated注解,并在注释里写清楚不建议使用,或者作废的原因,建议的类/方法应该用什么。
-
不同逻辑、不同语义、不同业务的代码之间插入一个空行分隔开来以提升可读性,但不要连续插入多个空格。
-
api做了接口变动建议升版本 ,发布前使用master进行deploy。
-
区分Util 和服务,有业务逻辑的,要访问外部数据源的,可能没有别人能用到,一律写成service,只有比较基础且逻辑简单的静态方法,在写成util ,写之前搜索一下是否有类似的方法,或者开源工具包。能复用就不要新写,就算新写也尽量 。
-
对外访问的逻辑尽量写在external包中。
-
常量按照类型归类,比如redis的Key 单独一个类,某些常量只有一个地方用,也可以定义在使用类的头部,而不放在常量类中。
-
对象转换使用mapstruct 工具包,能自动生成转换代码且不使用反射,不会使用mapstruct的可以看这里:
-
mybatis禁止使用QueryClause等代码拼接sql方式,也禁止mybatis注解将sql写入到java代码中如
@select("select 1 from dual")、String sql = “select * from table”
-
mybatis查询可以使用Bo po作为入参条件,但是bo的每个值和po的每个值都必须在sql中有使用。
-
Mybatis 自定sql 放在Ext文件夹下的xml中,避免被覆盖丢失。
-
mybatis在insert或者Merge或者select时,尽量使用 <include refid="Base_Column_List" /> ,避免新增字段遗漏。
-
mybatis无特殊场景必须使用#{},并指定jdbcType,不要使用${}。
-
如果有if做where时使用<where>标签,禁止使用
where 1=1
-
使用in传入list用来<foreach>循环拼接时,控制list的数量不超过999。
- 批量Insert时,必须控制行数,最多不能超过1000。
- sql的update如果使用乐观锁,务必判断返回行数是否和预期一致。
- sql中不要有复杂处理,比如格式化字符。
- 如果sql查询的数据量过大,必须分页,避免内存溢出。
- 查询带分页的sql必须带排序,排序字段必须唯一,避免数据错乱。
- 表结构变更时,必须检查所有xml中的字段是否都已经新增加,不能只加自己使用的那个sql,别的sql就放弃不管。
- 产线数据库连接必须配置密文。
- 在测试环境和产线环境合理设置数据库连接池。
- 事物在保证一致性的前提下,尽可能的缩小范围,严禁在一个事物内,做很多查询或复杂业务逻辑计算或者调用外部接口。
- sql中不要使用 sysdate now() 等数据库时间,避免出现数据库时间和服务器时间不一致的情况
- sql查询结果禁止使用 select *
- 表关联使用 join 关键字,禁止使用where语句关联
select * 表a,表B where a.字段 = b.字段
- 固定线程的线程池需要使用spring的ThreadPoolTaskExecutor ,并维护在spring的IOC容器中,降低回收成本。
- 线程池需要设置合适的最大,最小线程数,队列长度,队列满了的处理方式,队列长度禁止设置成无界队列。
- 禁止使用FixedThreadPool、禁止在方法里创建一个线程池,然后在销毁。
- 使用spring的@Async注解必须指定线程池。
- 代码如果无特殊业务处理不要catch异常,框架会自处理并转换为错误码。
- 如果需要返回错误码,请使用业务异常,错误码必须使用枚举定义,禁止多个错误使用同一个code。
- 定义本地缓存Map注意要能过期和控制总大小,建议使用本地缓存框架。
- 缓存必须设置过期时间,控制value大小,过期时间需要合理预估,留好手动清理缓存的入口。
- Redis key使用时必须带有数据版本字段,以免改变缓存结构导致报错。
- Redis key使用时必须用系统名做前缀,保证全局唯一。
- Redis Key必须覆盖全部入参,禁止sql有5个入参,key里却只有两个。
- 缓存value不能过大,会影响集群性能
-
禁止直接使用System.out 或System.err 输出日志或使用 e.printStackTrace()打印异常堆栈。
-
异常必须打印堆栈,禁止使用
log.error(e.getMessge())或log.error(“error,{},{}”,”XXX”,e)
-
打印日志时禁止字符串拼接,应该使用{}传递参数方式
logger.debug("param {} ", param)
- 禁止使用PO BO直接作为请求响应,禁止使用DTO直接传入数据库层。
- Po/Bo/Dto的类型必须要使用包装类型 Integer Long 等。
- Bo按需使用, 不同需求不能使用同样的Bo,如bo有10个字段,你只用2个。另外8个空着,或者这个功能用4个,那个功能用另外6个。
- 所有DTO PO BO必须继承对应的 BaseDto、BasePo、BaseBo ,同时设置serialVersionUID,相关类命名也应该以 BO PO DTO结尾, 如UserBo。
- DTO代表请求响应层对象,PO表示数据库实体对象,BO表示非DTO和PO的对象。
- 方法参数不得超过5个,超过使用Bo封装。
- 对外暴露的api 方法上和dto上必须清晰的使用swagger注解标注清楚中文含义,可能的枚举值。
- Dto禁止使用枚举类型作为出入参类型
- 所有的抽象方法(包括接口中的方法)必须要用 Javadoc 注释、除了返回值、参数、异常说明外,还必须指出该方法做什么事情,实现什么功能。
- 方法内部单行注释,在被注释语句上方另起一行,使用//注释。方法内部多行注释可以使用/* */注释或//注释,注意与代码对齐。
- 所有的枚举类型字段必须要有注释,说明每个数据项的用途。
- 复杂业务方法体必须使用//详细注释代码逻辑。