如何有效地比较同一类的两个对象并检查哪些是不同的字段?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何有效地比较同一类的两个对象并检查哪些是不同的字段?相关的知识,希望对你有一定的参考价值。

我想编写一个泛型函数,它接受同一实体类的两个对象,并比较不同的字段,并返回对特定字段所做的所有更改的List以及时间。

许多实体类中的一个会说成员如下

public class Member {
    String firstName;
    String lastName;
    String driverLicenseNumber;
    Integer age;
    LocalDateTime timestamp;
}

在DB中,我有一个名为member_audit的表,只要使用触发器在成员表中发生更改,就会使用旧数据填充该表(与其他实体类似)。

我要返回的每个实体的资源列表都是这样的

public class MemberAuditsResource {
    private String field;
    private LocalDateTime on;
    private String changeType;
    private String oldValue;
    private String newValue;
}

我只能想到像这样分别为每个实体编写一个函数

private List<MembeAuditsResource> memberCompare(Member obj1, Member obj2) {

    //Compare every field in both the objects using if else and populate the resource.

}

然后调用上面的函数来比较entity_audit表中的每对记录。代码将非常大,以比较每个字段并乘以不同的实体。有更好更有效的方法吗?

答案

如果您扩展想法以比较对象图,那么这不是一个小问题。因此,有效的方法不是重新发明轮子,而是使用现有的库,如JaVers

Member oldMember = new Member("foo" ,"chan" ,"AB12" , 21 ,LocalDateTime.now());
Member newMember = new Member("bar" ,"chan" ,"AB12" , 22 ,LocalDateTime.now());

Diff diff = javers.compare(oldMember, newMember);
for(Change change:  diff.getChanges()) {
    System.out.println(change);
}

然后,你可以得到类似的东西:

ValueChange{ 'firstName' changed from 'foo' to 'bar' }
ValueChange{ 'age' changed from '21' to '22' }
另一答案

使用JSON Map方法将两个对象转换为objectMapper.convertValue。然后,您可以轻松地比较两个地图的键/值并创建差异列表。

以上是关于如何有效地比较同一类的两个对象并检查哪些是不同的字段?的主要内容,如果未能解决你的问题,请参考以下文章

Swift:检查来自同一类的 2 个对象是不是具有不同的值?

==与===

如何使用cpp中的QThread使用一个对象运行同一类的两个线程?

如何在处理负零时有效地比较两个浮点值的符号

如何将同一父类的两个子类视为相同但不同的类型?

Javascript 中 == 和 === 的区别