実現したいこと
独自のクラス変数型の配列を比較し、差分を取得したいです。
試したこと
下記のように配列をListに変換し、removeAllで差分のみ残そうとしましたがhashCodeが異なるため実現できないことがわかりました。
Java
1 // テストオブジェクト一覧取得 2 TestObj[] behoreObjs = getBeforeObjs(); 3 TestObj[] afterObjs= getAfterObjs(); 4 5 // 配列→Listに変換 6 List<TestObj> behoreObjList = new ArrayList<TestObj>(Arrays.asList(behoreObjs)); 7 List<TestObj> afterObjList = new ArrayList<TestObj>(Arrays.asList(afterObjs)); 8 9 if (!afterObjList.equals(behoreObjList)) { 10 if (afterObjList.removeAll(behoreObjList)) { 11 for (TestObj obj : afterObjList) { 12 // 差分オブジェクトを削除 13 delete(obj); 14 } 15 } 16 }
TestObj
は一意のIDを保持しているため、equals
をオーバーライドしIDを比較することも検討しましたが、TestObjクラスに手を加えたくありません。
この場合、どのように差分を取得するのがスマートでしょうか?
開発環境
Java 1.7
TestObj の扱いにおいて ID が同じなら同じオブジェクト(データ)であるのでしたら、 equals をオーバーライド "すべき" と思いますが、なぜ手を加えたくないのでしょうか。
コメントありがとうございます。
今回新機能のテストケースでTestObjを扱いたく、テストケースのために既存クラス(TestObj)に手を加えるのを躊躇ったためです。
「同じオブジェクトで無ければ同一と判断しない」というのが TestObj の equals の仕様であれば変更出来ませんが、そうで無いならば TestObj の不備が見つかったことになります。さらに、テストに必要な機能であればそれを直すのが先に思えますが、如何でしょう。
また逆に equals の仕様がそうであれば、getBeforeObjs と getAfterObjs が返した中で同一の ID のオブジェクトは同じオブジェクトでなければならないのですから、そうなっていないならどちらかのメソッドのバグと判断しなければならないようにも思います。
> TestObjは一意のIDを保持しているため、equalsをオーバーライドしIDを比較することも検討しましたが
じゃあこのコード内で使っているequalsは、オーバーライドしていないObjectのequalsと同じものという事ですか?
>jimbeさん
なるほど…既存の影響範囲の広さからなんとなく敬遠してしまっていたのですがそのあたりも考えてみます。
>swordoneさん
試したことに記載しているコードのequalsはObjectのequalsです。
そのため期待していたTestObjの内容が全く同じかという判断はできていません。(こちらについてはremoveAllが期待した動きにならないことで気付き学びました。)
回答1件
あなたの回答
tips
プレビュー