为了账号安全,请及时绑定邮箱和手机立即绑定

FindBugs-IDEA汇总(整理中)

标签:
Java

主题001:低效使用keyset迭代,应该使用entrySet迭代

(Inefficient use of keySet iterator instead of entrySet iterator)

总结:

1,当遍历map,同时要获取key 和value时,推荐使用entrySet

示例功能与代码:

 Map<Integer, String> userMap = new HashMap<>(16);
 //填充数据
 //进行遍历key  和value,组装数据
 for (Integer key : userMap.keySet()) {
    list.add(new Test(key, userMap.get(key)));
 }`

优化后代码:

 Map<Integer, String> userMap = new HashMap<>(16);
	 //填充数据
	 //进行遍历key  和value,组装数据
	 for (Map.Entry<Integer, String> entry : userMap.entrySet()) {
            list.add(new TestData(entry.getKey(), entry.getValue()));
      }

为什么说,这种情况下,keyset效率会低点,
可以简单理解为,keyset是先遍历查询到key ,再用key去查询value
而entrySet是在找到key的时候,顺带着把value也带出来了。

主题002: 本地变量存储了闲置不用的对象

(dead store to local variable)

总结:

1,不要写多余的代码,不要声明多余的变量;

2,当需要删除业务代码时,记得把不再使用的变量也一并删除

3,在一定程度上,也可以防错,例如明明一个要用的变量,但并没有被使用,说明,要不漏写代码了,要不就某个地方写错了

示例功能与代码:

   public static void test20200310() {
        //本地变量存储了闲置不用的对象
        //dead store to local variable
        Integer num1 = 88;
        Integer num2 = 99;
        System.out.println(num2);
    }

方法中有2个变量,num1,num2, 但num2有使用,num1声明后并没有被使用,所以

Integer num1 = 88; 

这行代码要删除掉

主题003: 无用的对象被创建

(Useless object created)

总结:

1,和“本地变量存储了闲置不用的对象”还是有区别的,一个是只是被创建了,但一直就没用到,这个侧重于该对象被创建,也有使用,但实际无实际价值

2,每一行代码要有它本身的价值

示例功能与代码:

	public Result<String> selectStartEqpByTaskId(@RequestBody MoTaskIdParam param) {
        EqpNameListRes res = new EqpNameListRes();
        String eqpNameList = moTeamTaskService.selectStartEqpByTaskId(param, getUser());
        res.setEqpNameList(eqpNameList);
        return Result.ok(eqpNameList);
    }

优化后代码:

public Result<String> selectStartEqpByTaskId(@RequestBody MoTaskIdParam param) {
        String eqpNameList = moTeamTaskService.selectStartEqpByTaskId(param, getUser());
        return Result.ok(eqpNameList);
    }

上面的代码是一个查询方法,但可以看到方法体中的第一行代码实例化了一个EqpNameListRes,第三行也有使用,但实际返回时,和这个对象并没有关系。

主题004: 忽略了方法的返回值

(Method ignores return value)

总结:

1,准确使用方法,同时要细心

示例功能与代码:

public static  void test20200313(){
        //忽略了方法的返回值
        //Method ignores return value
        String replaceTest="aaaabbbcccaaa";
        //把 b 改为 B
        replaceTest.replace("b","B");
        //输出replaceTest变没变
        System.out.println(replaceTest);

        //把 b 改为 B,并接收
        replaceTest= replaceTest.replace("b","B");
        //重新输出replaceTest变没变
        System.out.println(replaceTest);
    }

输出结果:

aaaabbbcccaaa
aaaaBBBcccaaa

可以看到第一次输出,字符串本身并没有改变,第二次输出,才改变了。因为replace方法是返回了一个新对象,而不是直接修改字符串本身。
因此,在使用系统方法时,注意是否有返回值,是否是直接改变他本身

点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
13
获赞与收藏
7

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消