Java常见CodeReview及编码规范

2023-11-30 11:30

本文主要是介绍Java常见CodeReview及编码规范,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

鉴于自己的开发经验,以及常见容易产生bug及性能问题的点做个记录.

1.数据库

如果开发人员的经验不足,Java通过ORM(Mybatis)对数据库的操作的性能问题比较隐蔽.因为不压测或者异常case没发生的时候一般发现不了问题.特别是异常case发生的时候.

  1. 除配置表以外的sql都要经过explain分析表扫描范围.必须控制在range级别及以下
  2. Mybatis防sql注入: #{}传入的参数在SQL中显示为字符串,#{}方式能够很大程度防止sql注入.${}传入的参数在SqL中直接显示为传入的值,${}方式无法防止Sql注入
  3. selectList之类的操作,必须要限定返回的行数.有时候没有条件传入很可能就是全表扫描返回了.
  4. Mybatis的LambdaQueryWrapper的 in()函数入参有上限.超过则会报错
  5. 禁止多表联合join
  6. 多多利用主键索引或唯一索引提升查询效率
  7. 用批量插入代替循环迭代插入
  8. 表设计时,后期若有分库分表需求的,主键不可使用自增id,不方便迁移数据.可以使用分布式主键生成器,例如Snowflake算法生成的ID
  9. 表设计时,建立合理的联合索引,覆盖索引,最大程度覆盖查询需求
  10. 表设计时,尽量不要允许null值,状态类字段用精简的字符串枚举
  11. 查询数据库数据只返回必要的字段,一般不使用select *

2.Java基础API

  1. HashMap迭代使用entrySet() 获取Map 的key 和value
  2. 使用Collection.isEmpty()而不是Collection.size()来判空, O(1)
  3. 初始化集合,Map,队列一般都要指定初始大小.谨慎使用无界队列
  4. 使用StringBuilder 拼接字符串
  5. 字符串转化使用String.valueOf(value),可以避免NPE
  6. 方法返回值不要返回null,返回空集合或者对象都行
  7. 使用equals方法时,常量放前面
  8. 尽量不要出现魔法值,多多使用枚举,枚举的属性字段必须是私有且不可变
  9. 工具类设计成单例或者池化,工具类中屏蔽(private)构造函数
  10. 使用线程池时要注意队列大小以及拒绝策略,若发生拒绝时该如何保证业务逻辑原子性
  11. 若使用http调用必须要有超时限制,以及超时处理
  12. 加锁时,专锁专用,顺序加锁,避免死锁发生的可能
  13. 使用线程池配合ThreadLocal时养成remove的习惯,规避潜在的溢出风险

3.Spring

  1. 事务失效问题,注意事务传播特性,特别注意嵌套方法catch异常的问题,导致业务数据不完整
  2. 避免大事务
  3. 分布式事务影响性能,可以选择无事务的最终一致性实现
  4. 使用构造函数注入而不是字段注入,以提高代码的可测试性和可维护性
  5. 有大量的@Scheduled任务需要同一时刻执行时,调大默认Scheduled线程的数量.否则可能会导致一些任务阻塞住
  6. 避免频繁的对象创建和销毁,使用合适的对象池或缓存
  7. 关键日志信息打印,合理使用日志级别.代码注释完备

4.性能提升

  1. 比较重要的就是接口性能优化,利用并发工具类等手段提升接口响应时间.比如用completeFuture CountDownLatch等并发处理业务数据
  2. 涉及其他服务调用的接口,必须有快速熔断,不能因为上游服务的问题影响本身的服务.需要充分考虑别的服务返回给自身的数据异常的情况
  3. 利用分布式缓存提升接口性能
  4. 可以异步执行的逻辑可以放到消息队列或异步线程.让当前接口快速响应.提升用户体验
  5. 代码实现选用业界最佳实践,比如用Disruptor队列替代ArrayBlockingQueue
  6. 多多了解各个场景的业界最佳实践,比如用NIO替代AIO

5.设计实现

  1. 接口设计实现是否符合单一职责、开闭原则等设计原则
  2. 使用接口而不是具体实现进行注入,以降低耦合性
  3. 是否有冗余、重复的代码,是否可以进行重构
  4. 代码设计实现尽量符合设计模式,提升健壮性和可维护性
  5. 沉淀基础能力,不要重复造轮子.比如动态线程池工具,分布式锁工具 可以封装成Springboot starter包.一键式装配应用

在这里插入图片描述

这篇关于Java常见CodeReview及编码规范的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/436849

相关文章

SpringMVC获取请求参数的方法

《SpringMVC获取请求参数的方法》:本文主要介绍SpringMVC获取请求参数的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下... 目录1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、@RequestParam4、@

SpringBoot应用中出现的Full GC问题的场景与解决

《SpringBoot应用中出现的FullGC问题的场景与解决》这篇文章主要为大家详细介绍了SpringBoot应用中出现的FullGC问题的场景与解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录Full GC的原理与触发条件原理触发条件对Spring Boot应用的影响示例代码优化建议结论F

springboot项目中常用的工具类和api详解

《springboot项目中常用的工具类和api详解》在SpringBoot项目中,开发者通常会依赖一些工具类和API来简化开发、提高效率,以下是一些常用的工具类及其典型应用场景,涵盖Spring原生... 目录1. Spring Framework 自带工具类(1) StringUtils(2) Coll

前端下载文件时如何后端返回的文件流一些常见方法

《前端下载文件时如何后端返回的文件流一些常见方法》:本文主要介绍前端下载文件时如何后端返回的文件流一些常见方法,包括使用Blob和URL.createObjectURL创建下载链接,以及处理带有C... 目录1. 使用 Blob 和 URL.createObjectURL 创建下载链接例子:使用 Blob

SpringBoot条件注解核心作用与使用场景详解

《SpringBoot条件注解核心作用与使用场景详解》SpringBoot的条件注解为开发者提供了强大的动态配置能力,理解其原理和适用场景是构建灵活、可扩展应用的关键,本文将系统梳理所有常用的条件注... 目录引言一、条件注解的核心机制二、SpringBoot内置条件注解详解1、@ConditionalOn

通过Spring层面进行事务回滚的实现

《通过Spring层面进行事务回滚的实现》本文主要介绍了通过Spring层面进行事务回滚的实现,包括声明式事务和编程式事务,具有一定的参考价值,感兴趣的可以了解一下... 目录声明式事务回滚:1. 基础注解配置2. 指定回滚异常类型3. ​不回滚特殊场景编程式事务回滚:1. ​使用 TransactionT

Spring LDAP目录服务的使用示例

《SpringLDAP目录服务的使用示例》本文主要介绍了SpringLDAP目录服务的使用示例... 目录引言一、Spring LDAP基础二、LdapTemplate详解三、LDAP对象映射四、基本LDAP操作4.1 查询操作4.2 添加操作4.3 修改操作4.4 删除操作五、认证与授权六、高级特性与最佳

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

SpringSecurity JWT基于令牌的无状态认证实现

《SpringSecurityJWT基于令牌的无状态认证实现》SpringSecurity中实现基于JWT的无状态认证是一种常见的做法,本文就来介绍一下SpringSecurityJWT基于令牌的无... 目录引言一、JWT基本原理与结构二、Spring Security JWT依赖配置三、JWT令牌生成与

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim