1

異なる型の (そして型階層に共通のスーパークラスを持たない) 2 つの複雑なオブジェクトを比較する必要がありますが、論理的には同等である可能性があります。問題は、オブジェクトが等しくない場合に比較の結果に関する情報を返す方法にあります。オブジェクトが等しくない理由 (どのフィールドが異なり、どのように異なるのか) を呼び出し元に通知したいと思います。

これまでのオプションは次のとおりです。

  • 文字列を返す
  • 例外をスローする

しかし、私はそれらが非常にエレガント/良いとは思いません。

また、フィールド比較を JUnit から assertEquals に委譲し、比較テストを行わずに JUnit に基づいて比較を行う方法はありますか?

4

4 に答える 4

4

比較が複雑な場合、比較の結果は(あなたが言及したように)複雑になる可能性があります。

したがって、3 番目のオプションを検討することをお勧めしますComparisonResult。結果の情報をカプセル化するカスタム クラスを作成します。

少し階層を作成し、ポリモーフィズムに依存してコードを簡素化することもできます。次に例を示します。

ComparisonResult
|
+--- Equals
|
+--- Not equals
     |
     +--- Compatible (with "isAbeforeB()")
     |
     +--- Incompatible (with "getReason()")

Incompatibleオブジェクトが非互換である理由のリストによって実装することをお勧めします。MissingField理由自体が、などのサブクラスを持つ抽象クラスである可能性があります。

于 2012-05-09T07:42:31.647 に答える
0

Difference オブジェクトのリスト、または各項目が 1 つの違いを表す文字列のリストを返すことができます。

于 2012-05-09T07:47:07.837 に答える
0

equals メソッドは、ブール値 (等しいかどうか) のみを返す必要があります。

比較の機能と違いの取得の機能を混在させないでください。

あなたの目的のために、追加のメソッド(a.getDifferences(b)または共通のスーパークラス(オブジェクト以外)がない場合は静的メソッドComparision.getDifferences(a、b))を実装することは理にかなっています

equals の実装では、getDifferences メソッドを呼び出して、返されたオブジェクトが空かどうかを確認するのが理にかなっています。

結果は文字列または別のオブジェクトになる可能性があります

于 2012-05-09T07:44:43.050 に答える
0

気をつけろ!比較の実装が等号と一致しない場合、そのオブジェクトを別のコンテナー実装で使用するときに問題が発生する可能性があります。

とは言っても、比較インターフェイスは int しか返すことができないため、Comparableを実装しない別のメソッドを考え出す必要があります。

于 2012-05-09T07:44:00.230 に答える