2012-05-09 13 views
1

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

オプションは、これまでです:文字列

  • は例外
  • を投げるが、私は良い/彼らは非常にエレガント見つからない

    • リターン。

      また、フィールド比較をJUnitからのassertEqualsに委譲する方法があるので、比較テストを行わずにJUnitを比較して、実際の単体テストにすることはできますか?

    答えて

    4

    比較が複雑な場合、比較の結果は(あなたが言及したように)潜在的に複雑です。

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

    多少の階層を作成して多態性に頼ってコードを単純化することもできます。ここでは例です:

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

    Incompatibleは、おそらく私はあなたがオブジェクトに互換性がない理由のリストで実装示唆messiestクラスです。理由はおそらくそれ自身が抽象クラスで、サブクラスがMissingFieldなどである可能性があります。

    +0

    そして、そのようなクラスの概略的な構造は何ですか? – m3th0dman

    +0

    私はちょうど同じを投稿していた:+1 @ m3th0dman:それはあなたが比較する2つのオブジェクトの違いに依存します - すべての可能な違いのためのフィールド、私は提案するかもしれません。 – javatutorial

    0

    注意してください!比較実装がequalsと一致しない場合は、異なるコンテナ実装でそのオブジェクトを使用するときに問題が発生する可能性があります。

    しかし、比較インターフェイスはintを返すことしかできないので、ではなくのimpementと異なるメソッドを用意しなければなりません。

    0

    equalsメソッドはブール値(等しいかどうか)を返します。

    比較機能と違いを混在させないでください。あなたの目的のために

    はそれが

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

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

    結果は、文字列または個別のオブジェクト

    0

    あなたは違いのリストを返すことができるオブジェクトまたは各項目のウォールド一差を表す文字列のリストとすることができます。

    関連する問題