オープンソースのJavaオブジェクトコンパレータjava-object-diff実用的な戦闘
Open Source Java Object Comparator Java Object Diff Practical Combat
前書き
Java-object-diffは、Javaオブジェクト間の違いを見つけるためのシンプルですが強力なライブラリです。これには、2つのオブジェクトを比較し、オブジェクトとその子オブジェクトの違いを表すツリー構造を生成する必要があります。このツリー構造は、さらに情報を追加するか、基になるデータ構造を変更することで抽出できます。
- ほぼすべてのタイプのオブジェクトと考えられる任意の深さでネストできます
- 2つのオブジェクトの違いを発見する
- すべての変更テスト結果を教えてください
- ツリー構造の形状をトラバースする際の違いを返します
- 基になるオブジェクトへの読み取りおよび書き込みアクセスを提供すると、変更された値を抽出できるだけでなく、違いをパッチとして適用することもできます。
- 既存のクラスを変更する必要はありません(ほとんどの場合)
- 必要なものすべてをカスタマイズするための非常に柔軟な構成APIを提供します
- 小さなシンプルだが非常に強力なAPI
- オブジェクトグラフ内の循環参照を検出して処理します
- SLF4J以外の実行中の依存関係はありません
- Java1.5以降と互換性があります
指示
Mavenでの使用
de.danielbechler java-object-diff 0.95
Gradleでの使用 compile 'de.danielbechler:java-object-diff:0.95'
実際の戦闘
public class JavaObjectDiff { public static void main(String[] args) { Map working = Collections.singletonMap('item', 'foo') Map base = Collections.singletonMap('item', 'bar') DiffNode diff = ObjectDifferBuilder.buildDefault().compare(working, base) System.out.println(diff.hasChanges()) System.out.println(diff.childCount() == 1) NodePath itemPath = NodePath.startBuilding().mapKey('item').build() System.out.println(diff.getChild(itemPath).getState() == DiffNode.State.CHANGED) /** * method1 Traversal */ diff.visit(new DiffNode.Visitor() { @Override public void node(DiffNode node, Visit visit) { System.out.println(node.getPath() + ' => ' + node.getState()) } }) /** * method2 Reading Values */ diff.visit(new DiffNode.Visitor() { @Override public void node(DiffNode node, Visit visit) { final Object baseValue = node.canonicalGet(base) final Object workingValue = node.canonicalGet(working) final String message = node.getPath() + ' changed from ' + baseValue + ' to ' + workingValue System.out.println(message) } }) }
出力結果
true
true
true
/ =>変更
/ {item} =>変更
/ {item = bar}から{item = foo}に変更されました
/ {item}がbarからfooに変更されました
原理の説明
比較は、比較されるオブジェクトの内部レイヤータイプのequalsメソッドに基づいているため、比較ルールはオーバーライドによって定義できます。
参照
公式サイト: java-object-diff
Github: Github