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各个方法的弊端:
newFixedThreadPool和newSingleThreadExecutor:主要问题是堆积的请求处理队列可能会耗费非常大的内存,甚至OOM。newCachedThreadPool和newScheduledThreadPool:主要问题是线程数最大数是Integer.MAX_VALUE,可能会创建数量非常多的线程,甚至OOM。这里建议使用ThreadPoolExecutor的方式创建。
使用示例:
代码语言: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(strArray)返回值是仍然是一个可变的集合,但是返回值是其内部类,不具有add方法,可以通过set方法进行增加值,默认长度是10Collections.singletonList()返回的同样是不可变的集合,但是这个长度的集合只有1,可以减少内存空间。但是返回的值依然是Collections的内部实现类,同样没有add的方法,调用add,set方法会报错。
超过 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>我们可以使用本地线程处理:
代码语言: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>以上就是从Sonar上学习代码优化-代码异味案例的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号