0

0

从Sonar上学习代码优化-代码异味案例

星夢妙者

星夢妙者

发布时间:2025-07-12 10:00:18

|

804人浏览过

|

来源于php中文网

原创

sonar相信大家都不陌生了,很多公司都把sonar当做代码质量检测的工具,通过sonar来考察软件的质量,以及程序员的水平。我们在修改代码异味时,也逐渐提高了自己的编码水平。

从Sonar上学习代码优化-代码异味案例

下面我们来看看在Sonar中常见的一些代码问题吧。

包装对象的比较

案例代码

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">//两边都为Integer类型if(xxx.getLevel() == xxx.getCurrentLevel()) {    ...}</code>

sonar检测问题

对于Integer var=?在-128至127之间的赋值,Integer对象是在IntegerCache.cache产生,会复用已有对象,这个区间内的Integer值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用equals方法进行判断。

也就是说如果你使用的是包装类型的Integer,虽然在-128到127之间可以用==判断,但是超过这个值,就是两个对象之间的比较,用等号是不成立的。而我们是比较的内容,所以要用equals。

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">@Testpublic void testInteger() {    Integer a1 = 120;    Integer a2 = 120;    System.out.println("a1 == a2: " + (a1 == a2));    Integer a3 = 200;    Integer a4 = 200;    System.out.println("a3 == a4: " + (a3 == a4));    System.out.println("a3.equals(a4): " + (a3.equals(a4)));}</code>

运行结果:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">a1 == a2: truea3 == a4: falsea3.equals(a4): true</code>
手动创建线程池,效果会更好

案例代码

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">private static ExecutorService executor = Executors.newSingleThreadExecutor();</code>

Executors各个方法的弊端:

newFixedThreadPoolnewSingleThreadExecutor:主要问题是堆积的请求处理队列可能会耗费非常大的内存,甚至OOM。newCachedThreadPoolnewScheduledThreadPool:主要问题是线程数最大数是Integer.MAX_VALUE,可能会创建数量非常多的线程,甚至OOM。

这里建议使用ThreadPoolExecutor的方式创建。

使用示例:

AskAI
AskAI

无代码AI模型构建器,可以快速微调GPT-3模型,创建聊天机器人

下载
代码语言:javascript代码运行次数:0运行复制
<code class="javascript">ExecutorService pool = new ThreadPoolExecutor(5, 200,            0L, TimeUnit.MILLISECONDS,            new LinkedBlockingQueue <Runnable>(1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy());        pool.execute(()-> System.out.println(Thread.currentThread().getName()));        pool.shutdown();</code>
在使用正则表达式时,利用好其预编译功能,可以有效加快正则匹配速度

案列代码

代码语言:javascript代码运行次数:0运行复制
<code class="javascript"> Pattern pattern = Pattern.compile("^[1]\d{10}$");</code>

不要在方法体内定义:Pattern pattern = Pattern.compile(规则);

正确使用方式:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">public class XxxClass {          private static Pattern NUMBER_PATTERN = Pattern.compile("^[1]\d{10}$");        public static Pattern getNumberPattern() {             return NUMBER_PATTERN;        }    }</code>
集合初始化时,指定集合初始值大小

案例代码

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">Map<String, Object> cache = new HashMap<>();</code>

HashMap使用如下构造方法进行初始化,如果暂时无法确定集合大小,那么指定默认值(16)即可。

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">Map<String, String> map = new HashMap<String, String>(16);</code>
Arrays.asList()与Collections.singletonList()

Arrays.asList(strArray)返回值是仍然是一个可变的集合,但是返回值是其内部类,不具有add方法,可以通过set方法进行增加值,默认长度是10Collections.singletonList()返回的同样是不可变的集合,但是这个长度的集合只有1,可以减少内存空间。但是返回的值依然是Collections的内部实现类,同样没有add的方法,调用add,set方法会报错。

卫语句减少if-else嵌套

超过 3 层的 if-else 的逻辑判断代码可以使用卫语句、策略模式、状态模式等来实现。

示例:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">    public void today() {      if (isBusy()) {       System.out.println(“change time.”);       return;       }      if (isFree()) {       System.out.println(“go to travel.”);       return;      }      return;    }</code>
SimpleDateFormat线程不安全不要定义为static变量

我们可以使用本地线程处理:

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">private static final ThreadLocal<DateFormat> df = new ThreadLocal<DateFormat>() {     @ Override     protected DateFormat initialValue() {      return new SimpleDateFormat("yyyy-MM-dd");     }};</code>

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

530

2023.06.20

正则表达式不包含
正则表达式不包含

正则表达式,又称规则表达式,,是一种文本模式,包括普通字符和特殊字符,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式的文本。php中文网给大家带来了有关正则表达式的相关教程以及文章,希望对大家能有所帮助。

258

2023.07.05

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

765

2023.07.05

java正则表达式匹配字符串
java正则表达式匹配字符串

在Java中,我们可以使用正则表达式来匹配字符串。本专题为大家带来java正则表达式匹配字符串的相关内容,帮助大家解决问题。

219

2023.08.11

正则表达式空格
正则表达式空格

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。本专题为大家提供正则表达式相关的文章、下载、课程内容,供大家免费下载体验。

356

2023.08.31

Python爬虫获取数据的方法
Python爬虫获取数据的方法

Python爬虫可以通过请求库发送HTTP请求、解析库解析HTML、正则表达式提取数据,或使用数据抓取框架来获取数据。更多关于Python爬虫相关知识。详情阅读本专题下面的文章。php中文网欢迎大家前来学习。

293

2023.11.13

正则表达式空格如何表示
正则表达式空格如何表示

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。想了解更多正则表达式空格怎么表示的内容,可以访问下面的文章。

244

2023.11.17

正则表达式中如何匹配数字
正则表达式中如何匹配数字

正则表达式中可以通过匹配单个数字、匹配多个数字、匹配固定长度的数字、匹配整数和小数、匹配负数和匹配科学计数法表示的数字的方法匹配数字。更多关于正则表达式的相关知识详情请看本专题下面的文章。php中文网欢迎大家前来学习。

547

2023.12.06

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

23

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MongoDB 教程
MongoDB 教程

共17课时 | 3.2万人学习

XML教程
XML教程

共142课时 | 7.9万人学习

php-src源码分析探索
php-src源码分析探索

共6课时 | 0.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号