失之毫厘差之千里,你把“对象”放错位置了吗?

160 阅读2分钟
原文链接: click.aliyun.com

七夕,一波波狗粮,一波波情话,过了;

周末,一波波敌人,一波波海浪,也过了。

是时候放下你心里的那个对象好好工作了。

工作开始了,你是把你的对象放一旁了,但是你确定你把你的“对象”放对位置了吗?

这次我们聊聊把“对象”放错位置的后果。

前几天有一位同事需要做与我一样的功能,而这个功能是我已经开发好了的,他只需直接把我的代码拿去修改就可以。结果,我的代码可以正常运行,他的代码在开启服务之后,控制台就不断有日志输出,开发环境进入了死机状态。

在我们不懈地努力之下,最终发现了问题:他把一个对象的创建放在了循环体外。

以下是代码重现

       //在循环外部创建对象
        List<Item> itemListOut_t1 = new ArrayList<>();
        //创建中间对象 item_t1
        Item item_t1 = new Item();
        for (Item itemIn : itemListIn) {
            item_t1.setItemId(itemIn.getItemId());
            item_t1.setItemName(itemIn.getItemName());
            itemListOut_t1.add(item_t1);
        }

        //在循环内部创建对象
        List<Item> itemListOut_t2 = new ArrayList<>();
        for (Item itemIn : itemListIn) {
            //创建中间对象 item_t2
            Item item_t2 = new Item();
            item_t2.setItemId(itemIn.getItemId());
            item_t2.setItemName(itemIn.getItemName());
            itemListOut_t2.add(item_t2);
        }

运行结果如下:
_

通过控制台可以很容易地看出来,在循环外部创建对象是错误的,在循环内部创建对象是正确的。

产生出两种不同输出效果的原因如下:

在循环外部创建对象,使得循环内部一直使用同一个对象,虽然 itemListIn 循环了三次,item 也被三次添加到 itemListOut_t1,但是三次都是同一个对象,换句话说,最后 itemListOut_t1 得到的三个对象是相同的。

而在循环内部创建对象,循环内部使用的是三个不同的对象,最后 itemListOut_t1 得到三个不同的对象。

以下是相关文章链接:

当你无法发现问题所在时,不要简单地把代码或者数据还原

探讨:在循环前与在循环中创建对象的区别

以下是本次话题讨论:

1.你是否也遇到过上面的问题或者类似上面的问题?你当时是怎么找到问题的?又是怎么解决的

2.你是否还有其他因为放错位置而引发各种问题的经历?你是怎么解决的?