私は、集中的なプロセスの結果を表す複雑なデータ構造を返すWebサービスを持っています。サービスを応答可能にするために、プロセスは非同期タスクで実行されます。長時間実行されたタスクの結果と以前の結果の比較
サービスが初めて呼び出されると、空のデータ構造が返され、タスクが開始されました。後続のサービスコールは、タスクが完了するまで、キャッシュされたデータを返します。終了したら、結果が実際に変更されたかどうかを判断する必要があります。その場合、結果が更新された日時を示すプロパティを更新し、サービスによって新しい構造体が返されるようにキャッシュされたデータをリセットします。将来的には、さまざまな理由に基づいて、タスクが再開され、ロジックが繰り返されます。
私は、結果が「キャッシュされた」データから変更されたかどうかを判断する最も効率的な方法を探しています。最も単純なのは、構造内のすべてのオブジェクトにEqualsを実装することです。これは、子の等価性に基づいて親の等価性を持つことです。ルートオブジェクトでEqualsを呼び出すと、望ましい結果が得られます。しかし、構造全体をクロールする必要があります。これが最良のアプローチです。
また、元のコピーから開始し、構造内のオブジェクトが変更されたことを示すために 'IsDirty'フラグを使用することを考えましたが、コピー操作がパフォーマンス上の利点を無効にする可能性があることを心配します。
どのようなアプローチをとっていますか(なぜですか)?
これは、クラス自身がEqualsを実装し、単純なA == Bチェックを実行するよりも優れているのはなぜですか? – SonOfPirate
@SonOfPirate - これは、いくつかのフィールドをチェックするだけで、あなたの排他的な説明に従って使用される単純なクラスで動作します。デフォルトでは、平等ははるかに複雑なものです。新しいオブジェクト()==新しいオブジェクト()を試してみると、アドレススペースが異なるため(データはまったく同じですが)、falseになることがわかります。クラスの再帰的にプリミティブを比較するメソッドを構築すると、デフォルトの動作に違反することはなく、制御がより簡単になります。 – Polity
実際、Equalsは、アイデンティティの等価性を提供するコードでオーバーライドされるように設計されているため、Equalsは使用するのに最適な方法ではありません。 (例えば、Hashtableでは、2つの項目が等しいかどうかを判断するためにEqualsが使用されます。基本実装を使用すると、参照が同じオブジェクトに対して動作することはめったにないオブジェクトかどうかがチェックされます。つまり、IsaameAsか何か他のものと呼んでも、各オブジェクト内にカプセル化された '等価性'の基準を持つ方が良いと思います。 – SonOfPirate