首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >有没有一个Java库可以“区分”两个对象?

有没有一个Java库可以“区分”两个对象?
EN

Stack Overflow用户
提问于 2011-11-04 04:25:30
回答 7查看 80.6K关注 0票数 104

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

我维护的应用程序对此功能的实现很脆弱,有一些糟糕的设计选择,需要重写,但如果我们可以使用现成的东西,那就更好了。

这里有一个我正在寻找的东西的例子:

代码语言:javascript
复制
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作为一棵树是最自然的,但如果代码是可靠的,我就不会挑剔。

EN

回答 7

Stack Overflow用户

发布于 2012-08-29 04:53:22

可能有点晚了,但我和你的情况一样,最终为你的用例创建了我自己的库。因为我不得不自己想出一个解决方案,所以我决定在Github上发布它,以省去其他人的繁重工作。你可以在这里找到它:https://github.com/SQiShER/java-object-diff

-编辑

下面是基于OPs代码的一个小用法示例:

代码语言:javascript
复制
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;
票数 50
EN

Stack Overflow用户

发布于 2014-05-08 04:31:33

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

代码语言:javascript
复制
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序列化程序和反序列化程序来创建快照,并进行了更改,以便您可以轻松地将它们保存在数据库中。有了这个库,你可以很容易地实现一个审计模块。

票数 42
EN

Stack Overflow用户

发布于 2016-07-22 20:32:18

是的,Java库有一个用于比较两个java-util对象图的GraphComparator类。它以增量列表的形式返回差值。GraphComparator还允许您合并(应用)增量。此代码仅依赖于JDK,没有其他库。

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8001400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档