-3

这个问题与我对另一个问题的回答有关。原来的问题在这里

任何人都可以解释为什么错误的代码会按照评论中解释的方式失败(因为它是伪代码)

 // bad code
        ResultSet rs = getDataFromDBMS("Select * from [tableName];");

            //temp uses a collection member within it to hold a list of column names to data value pairs (hashmap<String,String>)
        Object temp = new objectToHoldInfoFromResultSet();

        // loop over the result set
        while (rs.next)// for each row in the result set
        {
            for (int i = 1; i <= rs.getNumberColums; i++) {
                temp.add(infoAboutColumn);
            }
            temp.printInfo();// always prints correct (ie current) info
                    //the print just takes the hashmap member and asks for a       
                    //toString() on it
            anotherObject(makeUseOf(temp));// always uses info from first
                   //iteration. Essentially grabs the hashMap member of temp, and puts
                   //this into another collection of type 
                   //HashMap< HashMap<String,String>, temp> see the linked question
                   //for more detail.

        }

        // Seemingly each loop into the while the temp.doSomethingToData(); uses
        // the temp object created in the first iteration

        // good code
        ResultSet rs = getDataFromDBMS("Select * from [tableName];");

        // loop over the result set
        while (rs.next)// for each row in the result set
        {
            Object temp = new objectToHoldInfoFromResultSet();// moving
                                                                // declaration
                                                                // of temp into
                                                                // the while
                                                                // loop solves
                                                                // the problem.
            for (int i = 1; i <= rs.getNumberColums; i++) {
                temp.add(infoAboutColumn);
            }
            temp.printInfo();// always prints correct (ie current) info

            anotherObject(makeUseOf(temp));// also uses the correct (ie current)
                                            // info.

        }
4

2 回答 2

1

我不知道为什么一个是好的,另一个是坏的。我的猜测(不知道 objectToHoldInfoFromResultSet 和其他方法的行为是什么)如下:

在第一种情况下,“objectToHoldInfoFromResultSet”(应该大写)每次都创建一次

temp.add(infoAboutColumn);

被调用,新的记录数据被添加到对象中。我猜应该为每条记录清除此信息......否则你会得到很多重复。通过重新初始化持有者对象来处理复制。即 (1 2 3 4 5 6) 而不是 (1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 1 2 3 4 5 6)。

对各种礼物不了解,我也无话可说。

于 2012-06-28T10:26:40.327 回答
1

temp.printInfo()如果不知道什么和在做什么,我们就无法可靠地回答这个问题makeUseOf()。很容易实现它们以按照您描述的方式行事。

当您temp在循环外实例化时,您将在循环的所有迭代中使用相同的对象。因此,它可以从每次迭代中收集数据(例如,收集到一个集合中)。然后,方法可以获取在当前迭代中累积的数据,以及从任何先前的迭代中累积的数据,如果不是故意的,这可能会导致问题。

所以让我们假设temp包含一个集合,并且在每次迭代中,结果集中的一列被添加到它。现在,如果temp.printInfo()实现打印有关此集合中最后一个元素的信息,而实现对集合中的第一个makeUseOf()元素执行某些操作,则会得到您观察到的行为。

OTOH,当您temp在循环内实例化时,您将在每次迭代中获得一个新的、不同的对象,它不会“记住”早期迭代中的任何数据。因此,即使使用上面概述的实现temp.printInfo()makeUseOf()您也会得到正确的结果。

于 2012-06-28T10:26:45.717 回答