-3

この質問は、私の別の質問に対する私の回答に関連しています。元の質問はここにあります

コメントで説明されている方法で悪いコードが失敗する理由を誰かが説明できますか(疑似コードであるwyによって)

 // 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 1 2 1 2 3 1 2 3 4 1 2 3 4 5 1 2 3 4 5 6)の代わりに(1 2 3 4 5 6)。

さまざまな適切なオブジェクトについて詳しく知らなければ、私があなたに話すことができることはそれほど多くありません。

于 2012-06-28T10:26:40.327 に答える
1

temp.printInfo()何をして何をしているのかを知らずに、これに確実に答えることはできませんmakeUseOf()。ただし、説明したとおりに動作するように実装するのは簡単です。

ループの外側でインスタンス化するtempと、ループのすべての反復で同じオブジェクトが使用されます。したがって、各反復からデータを収集することが可能です(たとえば、コレクションに)。そして、メソッドが現在の反復で、および以前の反復から蓄積されたデータを取得する可能性があります。これは、意図されていない場合に問題を引き起こす可能性があります。

したがって、コレクションが含まれていると仮定tempし、各反復で結果セットの列がコレクションに追加されます。これで、がこのコレクションの最後の要素temp.printInfo()に関する情報を出力するように実装され、コレクションの最初の要素で何かを実行するように実装されている場合、観察した動作が得られます。makeUseOf()

OTOHtempループ内でインスタンス化すると、各反復で新しい別個のオブジェクトが取得されます。これは、以前の反復からのデータを「記憶」しません。したがって、上記の実装temp.printInfo()makeUseOf()概要を示しても、正しい結果が得られます。

于 2012-06-28T10:26:45.717 に答える