有没有可以“diff”两个对象的Java库?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (78)

是否有一个类似于Unix程序差异的Java实用程序库,但对于对象?我正在寻找可以比较两个相同类型对象的东西,并生成一个表示它们之间差异的数据结构(并且可以递归地比较实例变量中的差异)。我不是在寻找一个文本差异的Java实现。我也没有寻找如何使用反射来做到这一点的帮助。

我所维护的应用程序具有脆弱的功能实现,这种功能有一些糟糕的设计选择,需要重新编写,但如果我们可以使用现成的东西,则会更好。

这是我正在寻找的一种事物的例子:

SomeClass a = new SomeClass();
SomeClass b = new SomeClass();

a.setProp1("A");
a.setProp2("X");

b.setProp1("B");
b.setProp2("X");

DiffDataStructure diff = OffTheShelfUtility.diff(a, b);  // magical recursive comparison happens here

经过比较后,实用程序会告诉我两个对象之间的“prop1”是不同的,“prop2”是相同的。我认为DiffDataStructure是一棵树是最自然的,但如果代码可靠,我不会挑剔。

提问于
用户回答回答于

http://javers.org是一个可以完全满足你需要的库:有像compare(Object leftGraph,Object rightGraph)这样的方法返回Diff对象。Diff包含一系列更改(ReferenceChange,ValueChange,PropertyChange),例如

given:
DummyUser user =  dummyUser("id").withSex(FEMALE).build();
DummyUser user2 = dummyUser("id").withSex(MALE).build();
Javers javers = JaversTestBuilder.newInstance()

when:
Diff diff = javers.compare(user, user2)

then:
diff.changes.size() == 1
ValueChange change = diff.changes[0]
change.leftValue == FEMALE
change.rightValue == MALE

它可以处理图形中的循环。

此外,您可以获取任何图形对象的快照。Javers具有JSON序列化器和反序列化器来进行快照,并进行更改,以便您可以轻松地将它们保存在数据库中。有了这个库,您可以轻松实现审计模块。

用户回答回答于

可能会有点迟,但我和你一样处于相同的境地,并最终创建了我自己的图书馆来满足你的使用情况。由于我自己不得不想出一个解决方案,所以我决定在Github上发布它,以免其他人付出艰辛的努力。你可以在这里找到它:https//github.com/SQiShER/java-object-diff

以下是基于OP代码的一个小例子:

SomeClass a = new SomeClass();
SomeClass b = new SomeClass();

a.setProp1("A");
a.setProp2("X");

b.setProp1("B");
b.setProp2("X");

DiffNode diff = ObjectDifferBuilder.buildDefault().compare(a, b);

assert diff.hasChanges();
assert diff.childCount() == 1;
assert diff.getChild('prop1').getState() == DiffNode.State.CHANGED;

扫码关注云+社区