如何使用java对象差异库来比较使用列表实现的一对多关系的对象图?

如何使用java对象差异库来比较使用列表实现的一对多关系的对象图?,java,object,graph,compare,Java,Object,Graph,Compare,我想比较涉及各种集合的复杂对象图的“工作”和“基本”副本,并创建更改日志。从stackoverflow中,我注意到java对象diff库()可以为我工作。我已浏览了可用的文档/示例,但仍不清楚: 1.它如何比较收藏? 2.集合中项目的顺序是否相关? 3.如何将其配置为使用“equals”方法而不是内省? 例如,如果我有一个“用户”和“角色”对象。一个用户可以有许多角色。两者都使用其标识符重写“equals”方法。如何比较用户的不同副本及其各自的角色 集合通过使用其项的equals和hashC

我想比较涉及各种集合的复杂对象图的“工作”和“基本”副本,并创建更改日志。从stackoverflow中,我注意到java对象diff库()可以为我工作。我已浏览了可用的文档/示例,但仍不清楚:

1.它如何比较收藏?
2.集合中项目的顺序是否相关?
3.如何将其配置为使用“equals”方法而不是内省?

例如,如果我有一个“用户”和“角色”对象。一个用户可以有许多角色。两者都使用其标识符重写“equals”方法。如何比较用户的不同副本及其各自的角色

  • 集合通过使用其项的equals和hashCode方法进行比较。每个项目将由所谓的
    DiffNode
    表示,并标记为
    未触及
    添加
    删除
    更改
    。如果在base中找到一个项目(具有相同标识)并正在工作,则将检查该项目是否有更改,并将其标记为
    未触及
    已更改
    。否则将分别标记为添加的
    或删除的
    。该库仍然缺少的一个功能是对集合中项目的排序和多次出现的支持。它基本上将所有集合类型视为
    Set
    ,只需检查对象是否存在。只要你不在乎订单,也不需要将一件物品多次放入同一个集合中,这应该不会是一个问题
  • 还没有。但是一个高级的列表当然是可能的,这也是我一直梦想的。这只是一个相当复杂的话题,我还没有开始
  • 有几种方法:可以使用
    @ObjectDiffEqualsOnlyType
    注释类型,或者使用
    @ObjectDiffProperty(equalsOnly=true)
    注释属性getter。如果不能使用注释,也可以通过使用
    配置的
    方法
    with equalsonlytype(最终类类型)
    with equalsonlyproperty(最终属性路径属性路径)
    以编程方式进行。即将发布的版本将附带一个流畅的配置API,使这种配置更容易、更强大

  • 关于您的示例:假设您将两个版本的
    用户
    传递给
    对象different
    ,java对象diff将返回一个节点(根节点),表示
    用户
    。只要不将用户类标记为equals only类型,就可以根据每个属性对其进行比较。每个属性最终都将作为根节点的子节点。现在让我们假设其中一个属性是角色的
    列表
    :库将对存在于基本版本和工作版本中的项目(已知项目)、仅存在于基本版本中的项目(已删除)和仅存在于工作版本中的项目(已添加)进行分组。这可以通过使用基础集合的
    contains
    方法或通过
    equals
    直接比较项目来实现。然后将检查“已知”项是否有更改。这可以是一个简单的调用
    equals
    或通过内省进行深入比较;取决于给定类型的配置方式。

    我的回答对您有帮助吗?