JAVA开发规范

文章列举了一系列Java编程的规范,包括但不限于禁止和必须使用的技术点,如避免使用Map作为参数,限制代码行数,推荐使用BigDecimal的特定构造方法,以及MyBatis的SQL编写规则,数据库操作的最佳实践,线程池配置建议,异常处理和日志记录的要求,DTO和POBO的设计原则,以及注释的规范等。
摘要由CSDN通过智能技术生成

一、代码相关

1、禁止使用相关

  1. 禁止使用Map、Pair、jsonObject等灵活对象作为参数传递和方法返回值。

  2. 框架的BaseResopnse 禁止带入service层。

  3. rest层禁止写业务逻辑,逻辑请放入service层。

  4. 禁止使用Lombok的 @Data注解 因为生成的toString Equaus hashcode 不会考虑父类,也会覆盖掉你重写的方法。

  5. 禁止对整个类进行格式化,如果需要格式化,值格式化选中的一小部分代码即可,避免冲突。

  6. get和set方法,禁止加业务逻辑,增加排查难度。

  7. 变量名需要和含义匹配,不能出现 a b str1 str2 这种无异议变量名。

  8. 变量名要和类型不能不匹配,比如定义一个Map 却命名list。

  9. 变量名不要以is开头,也不能下划线,特殊字符开头。

  10. TODO记得要解决,不能带上线。

  11. 不允许任何魔法值(即未经预先定义的常量)直接出现在代码中,如

     String s =”a”;
    
  12. 字符串拼接时,使用StringBuilder ,不要使用StringBuffer。

  13. 类不超过一千行。

  14. 方法体不超过一屏。

  15. 循环或者if嵌套不超过三层。

  16. 多条件排序 不允许使用 Comparator.comparing(类::属性一).reversed(); BIGDECIMAL 降序不支持; 推荐使用 Comparator.comparing(类::属性一,Comparator.reverseOrder());

2、必须使用相关

  1. BigDecimal在new的时候必须用字符串,

    new BigDecimal(“1”) 不要用 new BigDecimal(1) 
    
  2. BigDecimal变量使用toPlainString 来转换为字符串。

  3. 数字计算必须使用BigDecimal并指定保留小数位数。

  4. 涉及到金额拆分必须考虑最后一笔的精度尾差。

  5. 所有功能提测前必须经过代码走查和sonar扫描保证代码质量。

  6. 变量名必须驼峰首字母大写(除第一个字母)、方法必须首字母小写,多个单词用驼峰,类名首字母大写,常量全字母大写,单词用下划线连接。

  7. 成员变量必须private,有继承可以使用protected,禁止使用default作为修饰 。

  8. 合理分类和分包,同包的类 、或者同类的方法,必须有相关性,不能一个fund包里出现组合相关的类,一个分销信息的servcie类 出现了查询投顾信息的方法。

  9. 包名必须一个单词且全小写。

  10. 如果模块、接口、类、方法使用了设计模式,在命名时需体现出具体模式,如OrderFactory。

  11. 所有service必须有接口有实现类,注入的地方也必须使用接口注入, 禁止注入一个ServiceImpl类。

  12. 使用锁、分布式锁、文件流、必须有finally 释放,或使用1.7的try写法。

  13. 接口的实现类中的实现方法,必须加@Override 注解。

  14. equals方法的枚举或者常量一定要放在左边避免空指针,或使用 java.util.Objects#equals。

  15. switch一定要写default。

  16. 在 if/else/for/while/do 语句中必须使用大括号。即使只有一行。

  17. 如果这个方法或者这个类不建议使用,需要添加@Deprecated注解,并在注释里写清楚不建议使用,或者作废的原因,建议的类/方法应该用什么。

  18. 不同逻辑、不同语义、不同业务的代码之间插入一个空行分隔开来以提升可读性,但不要连续插入多个空格。

  19. api做了接口变动建议升版本 ,发布前使用master进行deploy。

  20. 区分Util 和服务,有业务逻辑的,要访问外部数据源的,可能没有别人能用到,一律写成service,只有比较基础且逻辑简单的静态方法,在写成util ,写之前搜索一下是否有类似的方法,或者开源工具包。能复用就不要新写,就算新写也尽量 。

  21. 对外访问的逻辑尽量写在external包中。

  22. 常量按照类型归类,比如redis的Key 单独一个类,某些常量只有一个地方用,也可以定义在使用类的头部,而不放在常量类中。

  23. 对象转换使用mapstruct 工具包,能自动生成转换代码且不使用反射,不会使用mapstruct的可以看这里:

Java对象转换方案分析与mapstruct实践

二、MyBatis相关

  1. mybatis禁止使用QueryClause等代码拼接sql方式,也禁止mybatis注解将sql写入到java代码中如

    @select("select 1 from dual")、String sql = “select * from table”
    
  2. mybatis查询可以使用Bo po作为入参条件,但是bo的每个值和po的每个值都必须在sql中有使用。

  3. Mybatis 自定sql 放在Ext文件夹下的xml中,避免被覆盖丢失。

  4. mybatis在insert或者Merge或者select时,尽量使用 <include refid="Base_Column_List" /> ,避免新增字段遗漏。

  5. mybatis无特殊场景必须使用#{},并指定jdbcType,不要使用${}。

  6. 如果有if做where时使用<where>标签,禁止使用

    where 1=1
    
  7. 使用in传入list用来<foreach>循环拼接时,控制list的数量不超过999。

三、数据库相关

  1. 批量Insert时,必须控制行数,最多不能超过1000。
  2. sql的update如果使用乐观锁,务必判断返回行数是否和预期一致。
  3. sql中不要有复杂处理,比如格式化字符。
  4. 如果sql查询的数据量过大,必须分页,避免内存溢出。
  5. 查询带分页的sql必须带排序,排序字段必须唯一,避免数据错乱。
  6. 表结构变更时,必须检查所有xml中的字段是否都已经新增加,不能只加自己使用的那个sql,别的sql就放弃不管。
  7. 产线数据库连接必须配置密文。
  8. 在测试环境和产线环境合理设置数据库连接池。
  9. 事物在保证一致性的前提下,尽可能的缩小范围,严禁在一个事物内,做很多查询或复杂业务逻辑计算或者调用外部接口。
  10. sql中不要使用 sysdate now() 等数据库时间,避免出现数据库时间和服务器时间不一致的情况
  11. sql查询结果禁止使用 select *
  12. 表关联使用 join 关键字,禁止使用where语句关联
		select * 表a,表B where a.字段 = b.字段

四、线程池相关

  1. 固定线程的线程池需要使用spring的ThreadPoolTaskExecutor ,并维护在spring的IOC容器中,降低回收成本。
  2. 线程池需要设置合适的最大,最小线程数,队列长度,队列满了的处理方式,队列长度禁止设置成无界队列。
  3. 禁止使用FixedThreadPool、禁止在方法里创建一个线程池,然后在销毁。
  4. 使用spring的@Async注解必须指定线程池。

五、异常相关

  1. 代码如果无特殊业务处理不要catch异常,框架会自处理并转换为错误码。
  2. 如果需要返回错误码,请使用业务异常,错误码必须使用枚举定义,禁止多个错误使用同一个code。

六、缓存相关

  1. 定义本地缓存Map注意要能过期和控制总大小,建议使用本地缓存框架。
  2. 缓存必须设置过期时间,控制value大小,过期时间需要合理预估,留好手动清理缓存的入口。
  3. Redis key使用时必须带有数据版本字段,以免改变缓存结构导致报错。
  4. Redis key使用时必须用系统名做前缀,保证全局唯一。
  5. Redis Key必须覆盖全部入参,禁止sql有5个入参,key里却只有两个。
  6. 缓存value不能过大,会影响集群性能

七、日志相关

  1. 禁止直接使用System.out 或System.err 输出日志或使用 e.printStackTrace()打印异常堆栈。

  2. 异常必须打印堆栈,禁止使用

    log.error(e.getMessge())或log.error(“error,{},{}”,”XXX”,e)
    
  3. 打印日志时禁止字符串拼接,应该使用{}传递参数方式

     logger.debug("param {} ", param)
    

八、DTO PO BO相关

  1. 禁止使用PO BO直接作为请求响应,禁止使用DTO直接传入数据库层。
  2. Po/Bo/Dto的类型必须要使用包装类型 Integer Long 等。
  3. Bo按需使用, 不同需求不能使用同样的Bo,如bo有10个字段,你只用2个。另外8个空着,或者这个功能用4个,那个功能用另外6个。
  4. 所有DTO PO BO必须继承对应的 BaseDto、BasePo、BaseBo ,同时设置serialVersionUID,相关类命名也应该以 BO PO DTO结尾, 如UserBo。
  5. DTO代表请求响应层对象,PO表示数据库实体对象,BO表示非DTO和PO的对象。
  6. 方法参数不得超过5个,超过使用Bo封装。
  7. 对外暴露的api 方法上和dto上必须清晰的使用swagger注解标注清楚中文含义,可能的枚举值。
  8. Dto禁止使用枚举类型作为出入参类型

九、注释相关

  1. 所有的抽象方法(包括接口中的方法)必须要用 Javadoc 注释、除了返回值、参数、异常说明外,还必须指出该方法做什么事情,实现什么功能。
  2. 方法内部单行注释,在被注释语句上方另起一行,使用//注释。方法内部多行注释可以使用/* */注释或//注释,注意与代码对齐。
  3. 所有的枚举类型字段必须要有注释,说明每个数据项的用途。
  4. 复杂业务方法体必须使用//详细注释代码逻辑。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值