SonarLint(代码质量检测工具+案例+好习惯养成器)

本文介绍了SonarLint和SonarQube这两个代码质量检测工具,SonarLint作为IDE插件提供实时反馈,而SonarQube在拉取请求和分支分析中发挥作用。文章列举了多个代码质量问题案例,涉及异常处理、变量使用、加密安全、代码结构等多个方面,强调了良好代码习惯的重要性。同时,提到了如何配置和使用SonarLint与SonarQube,以及它们在代码质量管理中的作用。
摘要由CSDN通过智能技术生成


参考文章

个人笔记(我不是运维我也不是测试),不同意见,望有交流
直接可以点击跳转连接

SonarLint官网

SonarQube官网

SonarCloud官网

SonarQube简介

SonarQube与SonarLint的区别和联系

一、 SonarLint是什么(代码质量检测器)

这个东西是一个很好的插件,可以养成量好的代码习惯,一个好的程序员代码质量肯定是需要合格的。
SonarLint官网
官网的话:

SonarLint 是一个免费的开源IDE 扩展,可识别并帮助您在编写代码时解决质量和安全问题。像拼写检查器一样,SonarLint 会显示缺陷并提供实时反馈和清晰的修复指导,以便从一开始就提供干净的代码。

他可以通过在idea中直接通过插件安装
在这里插入图片描述
安装后重启就可以使用了
可以直接 ctrl +shift+s对当前文件扫描质量
或者右键文件夹对整个包或者模块项目全部质量扫描
在这里插入图片描述

在扫描过后下面会有提示
像下面这些头部显示的图标就是有问题有严重的有不严重的,bug检测出来是一个小虫,如果是漏洞问题会显示一个锁。
在这里插入图片描述

SonarQube 和SonarCloud

使用 SonarLint + SonarQube 持续高效地交付
您的工作流程已经拥有所有正确的部分 - 它只需要一点涡轮增压。SonarLint 在您的 IDE 中捕获问题,同时 SonarQube分析拉取请求和分支。这种组合形成了一个持续的代码质量分析解决方案,可以让您的代码库保持干净。

您将花更少的时间审查代码问题,而将更多时间花在代码逻辑和解决有趣的问题上!
这两个也都可以做代码质量检测

SonarLint可以接收和连接SonrarQube对代码库扫描的结果从而通知Developer(程序员)

SonarQube的文档有安装的技巧
安装SonarQube 的时候报了jvm错误 ,只能手动改wrapper.conf文件
指向我再去的java版本
在这里插入图片描述
在这里插入图片描述
你可构建自己的项目,创建一个本地项目
在这里插入图片描述

需要下载

在这里插入图片描述
我卡这了,就是连不上,token和密码都不行,吐血而亡

二、代码质量问题案例

先说这些问题代码可不是我写的

1、异常应该被记录或重新抛出,但不能同时被记录和重新抛出

Exceptions should be either logged or rethrown but not both

no
在这里插入图片描述
yes在这里插入图片描述

2、局部变量不应该声明后立即返回或抛出

Local variables should not be declared and then immediately returned
or thrown

no
在这里插入图片描述
yes
在这里插入图片描述

3、不使用的“私有”字段应该被删除

没有用的东西删除

Unused “private” fields should be removed

no
在这里插入图片描述

yes
在这里插入图片描述

4、代码段不应该被注释掉

没用就不要了

Sections of code should not be commented out

no
在这里插入图片描述

yse
在这里插入图片描述

5、应该删除未使用的局部变量

Unused local variables should be removed

6、 在布尔表达式中应避免使用“布尔”

Boxed “Boolean” should be avoided in boolean expressions

7、Try-catch块不应该嵌套

Try-catch blocks should not be nested

8、加密算法应采用安全模式和填充方案

Encryption algorithms should be used with secure mode and padding
scheme

9、实例方法不应该写入“静态”字段

Instance methods should not write to “static” fields

在这里插入图片描述

10、非原语字段不应该是“易失性的” (原子性)

Non-primitive fields should not be “volatile”

将数组标记为volatile意味着数组本身将始终被刷新读取,而不会被线程缓存,但数组中的项将不会被刷新。类似地,将可变对象字段标记为volatile意味着对象引用是volatile,但对象本身不是,其他线程可能看不到对象状态的更新。

Atomic类型
AtomicIntegerArray:提供了原子性操作int数据类型数组元素的操作。
AtomicLongArray:提供了原子性操作long数据类型数组元素的操作。
AtomicReferenceArray:提供了原子性操作对象引用数组元素的操作。
保证原子类型的数组666

这可以通过使用相关的AtomicArray类(例如AtomicIntegerArray)来使用数组来回收。对于可变对象,应该删除volatile,并使用其他一些方法来确保线程安全,例如同步或ThreadLocal存储。
no
在这里插入图片描述
yes
在这里插入图片描述

11、“静态”基类成员不应通过派生类型访问

“static” base class members should not be accessed via derived types

为了代码的清晰性,基类的静态成员永远不应该使用派生类型的名称进行访问。这样做会让人感到困惑,可能会造成存在两个不同的静态成员的错觉

比如你继承了StringUtils自己有实现了另外一个StringUtils,当你通过你实现的StringUtils去调用原始的StringUtils中的isBlank时就会出现这个提醒

no

在这里插入图片描述
yse
在这里插入图片描述

12、应该删除不必要的导入

Unnecessary imports should be removed

没有用的引入就删除了把兄弟

在这里插入图片描述

13、不应使用原始类型

Raw types should not be used

No
在这里插入图片描述
YES
在这里插入图片描述

14、不应该抛出泛型异常

Generic exceptions should never be thrown

这是最基本的规范

NO

YES
在这里插入图片描述

15、常量名称应该符合命名约定

Constant names should comply with a naming convention

NO 常量应该全大写啊
在这里插入图片描述

16、应该返回空数组和集合,而不是null

Empty arrays and collections should be returned instead of null

不要return一个空。
在这里插入图片描述

17、方法的认知复杂性不应太高

Cognitive Complexity of methods should not be too high

NO 在SonarLint里面 认知复杂对不能超过15,
这么高的复杂度如果让另一个人来维护这个代码,会骂人的。

在这里插入图片描述

18、不应使用冗余强制转换

Redundant casts should not be used

NO 意思就是他多此一举的转换
在这里插入图片描述

在这里插入图片描述

19、代码段不应该被注释掉

Sections of code should not be commented out

没用的代码就删除,不要乱扔垃圾。

不行了不行了太多了我不干了

在这里面可以勾选这个规则或者取消规则
在这里插入图片描述

21、嵌套三元表达式会使代码更加难以理解。

在这里插入图片描述
在这里插入图片描述

22、实用程序类不应该有公共构造函数

Utility classes should not have public constructors

在这里插入图片描述

23、字符串不应该重复

String literals should not be duplicated

在这里插入图片描述

重复的字符串使用,字符串应该从一而终,不应该在找一个一样的。渣男呸

23、字符串#replace应优先于字符串#replaceAll

String#replace should be preferred to String# replaceAll

在这里插入图片描述
在这里插入图片描述
看第一个参数是regex 正则,但是有时候你用的不是,
SonarLint说:String::replace与String::replaceAll做的事情完全相同,没有regex的性能缺陷

24、子类字段不应覆盖父类字段

Child class fields should not shadow parent class fields

在两个不相关的类中有一个同名的变量是可以的,但在类层次结构中做同样的事情,往好了说会引起混乱,往坏了说会造成混乱。

意思应该是不应该命名和父类类似的名称

25、通过注入的依赖调用事务方法,而不是直接通过’this’调用

主要针对的是在使用Spring框架进行Java开发时,管理事务性方法的最佳实践。
当你在Spring中定义一个被@Transactional注解的方法时,Spring将创建一个代理来包装该方法所在的bean。这个代理负责在方法执行前后,处理事务的开始和提交(或回滚)。但是,如果你直接在类内部通过 this.方法名() 调用另一个@Transactional方法,那么这个调用就不会经过Spring创建的代理。因此,事务管理相关的逻辑不会被正确执行。

为了确保事务管理逻辑被正确应用,你需要通过Spring的依赖注入功能来调用另一个Bean中的事务方法,或者是将调用的方法放在单独的Bean中,并让Spring注入这个Bean。
改为 (这个会有循环依赖的问题)

@Service
public class MyService {
    
    // 自注入本类
    private final MyService myService;

    @Autowired
    public MyService(MyService myService) {
        this.myService = myService;
    }

    public void nonTransactionalMethod() {
        // 通过注入的方式调用事务性方法
        myService.transactionalMethod();
    }

    @Transactional
    public void transactionalMethod() {
        // 事务性逻辑
    }
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Network porter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值