JAVA代码规范审查
JAVA代码规范审查
1. 添加必要的注释
-
所有的类都必须添加创建者和创建日期,以及简单的注释描述
-
方法内部的复杂业务逻辑或者算法,需要添加清楚的注释
-
一般情况下,注释描述类、方法、变量的作用
-
任何需要提醒的警告或
TODO
,也要注释清楚 -
如果是注释一行代码的,就用
//
;如果注释代码块或者接口方法的,有多行/* **/
-
一块代码逻辑如果你站在一个陌生人的角度去看,第一遍看不懂的话,就需要添加注释了
/*** @author 田螺* @date 2023/04/22 5:20 PM* @desc 田螺的实现类,捡田螺、卖田螺 (更多干货,关注公众号:捡田螺的小男孩)*/
public class TianLuoClass {/*** 这是卖田螺的两法,它将两个田螺的价格整数相加并返回结果。* * @param x 第一个整数* @param y 第二个整数* @return 两个整数的和*/public int sellTianLuo(int x, int y) {return x + y;}
}
2.日志打印规范
-
日志级别选择不对。常见的日志级别有
error、warn、info、debug
四种,不要反手就是info
哈 -
日志没打印出调用方法的入参和响应结果,尤其是跨系统调用的时候。
-
业务日志没包含关键参数,如
userId,bizSeq
等等,不方便问题排查 -
如果日志包含关键信息,比如手机号、身份证等,需要脱敏处理
-
一些不符合预期的情况,如一些未知异常(数据库的数据异常等),又或者不符合业务预期的特殊场景,都需要打印相关的日志
3. 命名规范
-
类和接口应该使用首字母大写的驼峰命名法
-
方法和变量应该使用小写的驼峰命名法
-
常量应该使用全大写字母和下划线
-
开发者是不是选择易于理解的名称给变量、类和方法进行命名
4.参数校验
我们代码评审的时候,要注意参数是否都做了校验,如userId
非空检查、金额范围检查、userName
长度校验等等。一般我们在处理业务逻辑的时候,要遵循先检查、后处理
的原则。
5. 判空处理
-
获取对象或列表的属性时,都要判空处理。要不然很多时候会出现空指针异常。
6. 异常处理规范
-
不要捕获通用的
Exception
异常,而应该尽可能捕获特定的异常 -
在捕获异常时,应该记录异常信息以便于调试
-
内部异常要确认最终的处理方式,避免未知异常当作失败处理。
-
在
finally
块中释放资源,或者使用try-with-resource
-
不要使用
e.printStackTrace()
,而是使用log
打印。 -
catch
了异常,要打印出具体的exception
,否则无法更好定位问题 -
捕获异常与抛出异常必须是完全匹配,或者捕获异常是抛异常的父类
-
捕获到的异常,不能忽略它,要打印相对应的日志
-
注意异常对你的代码层次结构的侵染(早发现早处理)
-
自定义封装异常,不要丢弃原始异常的信息
Throwable cause
-
注意异常匹配的顺序,优先捕获具体的异常
-
对外提供APi时,要提供对应的错误码
-
系统内部应该抛出有业务含义的自定义异常,而不是直接抛出
RuntimeException
,或者直接抛出Exception\Throwable
。
7. 模块化,可扩展性
代码编写设计是否满足模块化,接口是否具有可扩展性
8. 并发控制规范
-
在使用并发集合时,应该注意它们的线程安全性和并发性能,如
ConcurrentHashMap
是线性安全的,HashMap
就是非线性安全的 -
乐观锁,悲观锁防止数据库并发.乐观锁一般用版本号
version
控制,悲观锁一般用select …for update
-
如果是单实例的多线程并发处理,一般通过Java锁机制,比如
sychronized ,reentrantlock
-
如果是同一集群的多线程并发处理,可以用
Redis
分布式锁或者走zookeeper
-
如果是跨集群的多线程并发处理,则考虑数据库实现的分布式锁。
-
在使用分布式锁的时候,要注意有哪些坑,比如redis一些经典的坑.
9. 单元测试规范
-
测试类的命名,一般以测试的类+
Test
,如:CalculatorTest
. -
测试方法的命名,一般以
test
开头+ 测试的方法,如testAdd
. -
单测行覆盖率一般要求大于
75%
. -
单测一般要求包含主流程用例、参数边界值等校验用例
-
单测一般也要求包含中间件访问超时、返回空、等异常的用例,比如访问数据库或者
Redis
异常. -
单测用例要求包含并发、防重、幂等等用例.
10. 代码格式规范
-
缩进使用四个空格
-
代码块使用花括号分隔
-
每行不超过
80
个字符 -
每个方法应该按照特定的顺序排列,例如:
类变量、实例变量、构造函数、公共方法、私有方法
等。
11. 接口兼容性
重点关注是否考虑到了接口的兼容性
12. 程序逻辑是否清晰,主次是否够分明
程序逻辑是否清晰。可以划分主次,抽一下小函数。
13. 安全规范
-
输入校验:应该始终对任何来自外部的输入数据进行校验,以确保它们符合预期并且不会对系统造成伤害。校验应该包括检查数据的类型、大小和格式。
-
防范SQL注入攻击:在使用SQL查询时,应该始终使用参数化查询或预处理语句,以防止SQL注入攻击。
-
防范跨站脚本攻击(XSS): 在Web应用程序中,应该始终对输入的HTML、JavaScript和CSS进行校验,并转义特殊字符,以防止XSS攻击。
-
避免敏感信息泄露: 敏感信息(如密码、密钥、会话ID等)应该在传输和存储时进行加密,以防止被未经授权的人访问。同时,应该避免在日志、调试信息或错误消息中泄露敏感信息。
-
防范跨站请求伪造(CSRF): 应该为所有敏感操作(如更改密码、删除数据等)添加
CSRF
令牌,以防止未经授权的人员执行这些操作。 -
防范安全漏洞: 应该使用安全性高的算法和协议(如HTTPS、TLS)来保护敏感数据的传输和存储,并定期对系统进行漏洞扫描和安全性审计。
14. 事务控制规范
-
一般推荐使用编程式事务,而不是一个注解
@Transactional
的声明式事务。因为@Transactional
有很多场景,可能导致事务不生效。 -
事务范围要明确,数据库操作必须在事务作用范围内,如果是非数据库操作,尽量不要包含在事务内。
-
不要在事务内进行远程调用(可能导致数据不一致,比如本地成功了,但是远程方法失败了,这时候需要用分布式事务解决方案)
-
事务中避免处理太多数据,一些查询相关的操作,尽量放到事务之外(避免大事务问题)
15. 幂等处理规范
幂等表示一次和多次请求某一个资源应该具有同样的副作用,或者说,多次请求所产生的影响与一次请求执行的影响效果相同。
关注接口是否考虑幂等。比如开户接口,多次请求过来的时候,需要先查一下该客户是否已经开过户,如果已经开户成功,直接返回开户成功的报文。如果还没开户,就先开户,再返回开户成功的报文。这就是幂等处理。
一般情况有这几种幂等处理方案:
-
select+insert+主键/唯一索引冲突
-
直接insert + 主键/唯一索引冲突
-
状态机幂等
-
抽取防重表
-
token令牌
-
悲观锁
-
乐观锁
-
分布式锁
幂等要求有个唯一标记,比如数据库防重表的一个业务唯一键。同时强调多次请求和一次请求所产生影响是一样的。
16. 中间件注意事项 (数据库,redis)
如果用数据库、Redis、RocketMq
等的中间件时,我们需要关注这些中间件的一些注意事项哈。
比如数据库:
-
关注数据库连接池参数设置、超时参数设置是否合理
-
避免循环调用数据库操作
-
如果不分页,查询
SQL
时,如果条数不明确,是否加了limit
限制限制 -
数据库的返回是否判空处理
-
数据库慢
SQL
是否有监控 -
表结构更新是否做兼容,存量表数据是否涉及兼容问题考虑
-
索引添加是否合理
-
是否连表过多等等
比如Redis
:
-
Redis的key使用是否规范
-
Redis 异常捕获以及处理逻辑是否合理
-
Redis连接池、超时参数设置是否合理
-
Redis 是否使用了有坑的那些命令,如
hgetall、smember
-
是否可能会存在缓存穿透、缓存雪奔、缓存击穿等问题。
17. 注意代码坏味道问题
-
大量重复代码(抽公用方法,设计模式)
-
方法参数过多(可封装成一个DTO对象)
-
方法过长(抽小函数)
-
判断条件太多(优化if...else)
-
不处理没用的代码(没用的import)
-
避免过度设计
18. 远程调用
-
不要把超时当作失败处理: 远程调用可能会失败,比如网络中断、超时等等。开发者需要注意远程调用返回的错误码,除非是明确的失败,如果仅仅是超时等问题,不能当作失败处理!而是应该发起查询,确认是否成功,再做处理。
-
异常处理:远程调用可能会抛出异常,例如由于服务端错误或请求格式不正确等。因此,开发人员需要确保能够捕获和处理这些异常,以避免系统崩溃或数据丢失。
-
网络安全:由于远程调用涉及网络通信,因此开发人员需要考虑网络安全的问题,例如数据加密、认证、访问控制等。尽可能使用安全的协议,例如
HTTPS 或 SSL/TLS
。 -
服务质量:远程调用可能会影响系统的性能和可用性。因此,开发人员需要确保服务的质量,例如避免过度使用远程调用、优化数据传输、实现负载均衡等。
-
版本兼容:由于远程调用涉及不同的进程或计算机之间的通信,因此开发人员需要注意服务端和客户端之间的版本兼容性。尽可能使用相同的接口和数据格式,避免出现不兼容的情况。
-
尽量避免for循环远程调用: 尽量避免for循环远程调用,而应该考虑实现了批量功能的接口。
相关文章:

JAVA代码规范审查
JAVA代码规范审查 1. 添加必要的注释 所有的类都必须添加创建者和创建日期,以及简单的注释描述 方法内部的复杂业务逻辑或者算法,需要添加清楚的注释 一般情况下,注释描述类、方法、变量的作用 任何需要提醒的警告或TODO,也要注…...

Centos8安装redis7
1.下载: 官网下载:Download | Redis 把安装包上传至服务器: 2.安装: 解压redis: [rootnode202 ~]# cd /usr/local/soft/ [rootnode202 soft]# tar -zxvf redis-7.0.11.tar.gz 安装: 进入redis-7.0.1…...

RabbitMQ详解(一):Linux安装
消息队列概念 消息队列是在消息的传输过程中保存消息的容器。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它。 常见的消息队列 RabbitMQ 基于AMQP(高级消息队列协议)基础上…...

Mojo:比 Python 快 35000 倍的 AI 编程语言
Mojo:比 Python 快 35000 倍的 AI 编程语言 Mojo是一门刚刚发布的面向 AI 开发人员的编程语言。 Mojo 被设计为 Python 的超集,所以如果你已经掌握了 Python,学习 Mojo 会很容易。关键是 Mojo 将 Python 的易用性与 C 语言的性能相结合&am…...

1703_LibreOffice常用功能使用体验
全部学习汇总: GreyZhang/windows_skills: some skills when using windows system. (github.com) 首先需要说明的是我不是一个重度Office用户,甚至算不上一个重度的Office用户。我使用的Office软件最多的功能就是文档编辑,绝大多数时候还是文…...

Postgres:Win/Linux环境安装及一键部署脚本
1.Win安装Postgres (1)下载安装包 (2)开始安装 修改安装目录 选择要安装的组件 data也就是库表及数据的.dba文件存放目录 密码设置 端口设置 next next 开始安装 安装完成,Stack Builder 根据需要选择是否安装。仅仅是…...

每日一题144——数组大小减半
给你一个整数数组 arr。你可以从中选出一个整数集合,并删除这些整数在数组中的每次出现。 返回 至少 能删除数组中的一半整数的整数集合的最小大小。 示例 1: 输入:arr [3,3,3,3,5,5,5,2,2,7] 输出:2 解释:选择 {3,…...

运维必懂的13条高效工作秘诀
正确做事,更要做正确的事 “正确地做事”强调的是效率,重视做一件工作的最好方法;“做正确的事”强调的是效能,重视时间的最佳利用——这包括是做或者不做某项工作。 实际上,第一重要的却是效能而非效率,…...

【牛客刷题专栏】0x26:JZ25 合并两个排序的链表(C语言编程题)
前言 个人推荐在牛客网刷题(点击可以跳转),它登陆后会保存刷题记录进度,重新登录时写过的题目代码不会丢失。个人刷题练习系列专栏:个人CSDN牛客刷题专栏。 题目来自:牛客/题库 / 在线编程 / 剑指offer: 目录 前言问…...

5/5~5/7总结
把socket通信改成了分成短连接和长连接,登录前的所有操作都是短连接,每次都关闭连接,如果登录成功了就保持该socket连接,登录成功之后的所有操作,修改资料,发信息等都用该socket, 服务端和客户…...

重要通知|Sui测试网将于5月11日重置
致Sui社区成员们: 正如之前公告所述,部分社区成员发现测试网可能会定期清除数据并重新启动。鉴于此,我们宣布计划将于2023年5月11日进行首次测试网清除。 对于想要继续读取和访问当前测试网络的社区成员,请使用由Mysten Labs在…...

教你快速把heic格式转化jpg,4种方法操作简单
教你快速把heic格式转化jpg的方法,因为HEIC格式图片通常出现在苹果公司的iOS 11操作系统及之后的版本中,这是因为苹果公司在这些版本中采用了HEIF(高效图像格式)作为默认的照片格式来替代JPEG格式。同时,需要注意的是&…...

交互式数据分析和处理新方法:pandas-ai =Pandas + ChatGPT
Python Pandas是一个为Python编程提供数据操作和分析功能的开源工具包。这个库已经成为数据科学家和分析师的必备工具。它提供了一种有效的方法来管理结构化数据(Series和DataFrame)。 在人工智能领域,Pandas经常用于机器学习和深度学习过程的预处理步骤。Pandas通…...

FIR滤波
参考来源: https://www.zhihu.com/question/323353814 本节主要围绕以下几个问题进行描述: 什么是FIR滤波器时域的卷积频域的相乘 关于FIR FIR滤波就是在时域上卷积的过程。将含噪声信号与低通滤波器的傅里叶逆变换值进行卷积,这个过程就是…...

Python小姿势 - Python中的类型检查
Python中的类型检查 在Python中,类型检查是通过内置函数isinstance()来实现的。 isinstance() 函数用于判断一个对象是否是一个已知的类型,类似 type()。 isinstance() 与 type() 区别: type() 不会认为子类是一种父类类型。 isinstance() 会…...

人工智能前景
人工智能AI的未来非常广阔和光明。随着科技的不断发展和普及,人工智能已经开始逐渐融入我们生活的方方面面,比如智能家居、智能医疗、无人驾驶等等。未来,随着更多的应用场景被开拓和挖掘,人工智能的应用范围将会越来越广泛&#…...

python并发编程学习笔记--生产者消费者模型 day02
目录 1. 什么是生产者消费者模型 2. 为什么引入生产者消费者模型 3. 如何实现 4. 示例 1. 什么是生产者消费者模型 生产者 : 程序中负责产生数据的一方消费者 : 程序中负责处理数据的一方 2. 为什么引入生产者消费者模型 在并发编程中, 生产者消费者模式通过一个容器来解…...

彩蛋丨利用R语言脚本实现批量合并Excel表格,再也不用手动点来点去了!
利用R语言脚本实现批量合并Excel表格 在整理数据的时候遇到一个问题:假如有很多个excel表,分别存放了一部分数据,现在想要快速把这些表格的数据汇总到一起,如何用R语言快速完成呢?本文分享一个脚本,能够自动…...

深入学习MYSQL-数据操纵及视图
前言 本博客中的例子和文字大部分来源于书籍《mysql必会知识》,后续会根据更多的书籍不断完善此笔记。 插入操作 可以这种方式向数据库插入两条数据,mysql和pg都支持这种写法。在实战中我们应该更多的使用这种写法,因为数据库的批量操作会…...

深入讲解eMMC简介
1 eMMC是什么 eMMC是embedded MultiMediaCard的简称,即嵌入式多媒体卡,是一种闪存卡的标准,它定义了基于嵌入式多媒体卡的存储系统的物理架构和访问接口及协议,具体由电子设备工程联合委员会JEDEC订立和发布。它是对MMC的一个拓展࿰…...

ICV:中国车载超声波雷达市场规模预计2024年可达20亿美元
近年来,由于市场对车辆先进安全功能的需求的增加,汽车超声波传感器市场一直保持稳步增长。ICV估计,车载超声波传感器全球市场预计在2022年至2027年之间以11.5%的复合年增长率增长,这种增长是由越来越多的高级驾驶辅助系…...

PointNet:利用深度学习对点云进行3D分类和语义分割
PointNet:利用深度学习对点云进行3D分类和语义分割 参考自,PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation 代码仓库地址为:https://github.com/charlesq34/pointnet/ 介绍 这次介绍的是一个比较基础的工作…...

第四十二章 Unity 下拉框 (Dropdown) UI
本章节我们介绍下拉框 (Dropdown),我们点击菜单栏“GameObject”->“UI”->“Dropdown”,然后调整它的位置,效果如下 其实它的本质就是一个下拉列表,然后选择列表中的一个选项而已。大家在很多网页中应该可以看到类似的UI元…...

STL常用梳理——STACK、QUEUE
STL——适配器篇 1、ListSTL list 容器介绍list使用 2、适配器介绍3、Deque容器Stack、Queue适配器实现 1、List STL list 容器介绍 STL list 容器,又称双向链表容器,即该容器的底层是以双向链表的形式实现的。这意味着,list 容器中的元素可…...

Unity物理系统基本概念
前言:物理引擎仅仅是对现实物理的一种近似模拟。无论是从运算精度和时间连续性都不够准确。目的只是为了让游戏具备令人信服的物理表现,增强游戏的表现力和用户的沉浸感。 一、刚体Rigidbody 刚体是让物体产生物理行为的主要组件。一旦挂载了Rigidbody组…...

防止表单重复提交的几种方式,演示一个自定义注解方式的实现
防止表单重复提交的几种方式,演示一个自定义注解方式的实现 一、防止表单重复提交的几种方式方式一:Token 机制方式二:去重表(主要是利用 MySQL 的唯一索引机制来实现的)方式三:Redis 的 setnx方式四&#…...

《基于智能手机采集的PPG信号预测血管老化》阅读笔记
目录 一、论文摘要 二、论文十问 Q1: Q1论文试图解决什么问题? Q2: 这是否是一个新的问题? Q3: 这篇文章要验证一个什么科学假设? Q4: 有哪些相关研究?如何归类?谁是这一课题在领域内值得关注的研究员?…...

【大数据-调度工具】dolphinscheduler安装和遇到的问题
1.安装 安装步骤按照官网安装即可 官网:DolphinScheduler | 文档中心 (apache.org) 版本:3.1.5 2.踩坑记录 Q1.大文件无法上传 问题描述: 在资源中心中上传文件选择完大文件夹之后,选择确认之后确认按钮转了几圈圈之后就没…...

滑动轨迹生成的思路和代码分享-测试可过极验 90%机率
如有技术侵权、可联系本人下架 由于极验采用人工智能的方式对滑动的轨迹进行的验证,因此如果我们比较随意的生成鼠标滑动轨迹基本是肯定被封的,因此我们要详细分析一下鼠标轨迹的规律, 通之前介绍的调试手段,手工滑动滑块,获取到鼠标滑动轨迹的集合数组如下: [[-37,-41…...

【Linux】项目自动化构建工具make/makefile
🏖️作者:malloc不出对象 ⛺专栏:Linux的学习之路 👦个人简介:一名双非本科院校大二在读的科班编程菜鸟,努力编程只为赶上各位大佬的步伐🙈🙈 目录 前言一、make/makefile的背景二、…...