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

问题描述 投票:2回答:2

我想编写一个泛型函数,它接受同一实体类的两个对象,并比较不同的字段,并返回对特定字段所做的所有更改的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表中的每对记录。代码将非常大,以比较每个字段并乘以不同的实体。有更好更有效的方法吗?

java spring spring-boot java-8
2个回答
3
投票

如果您扩展想法以比较对象图,那么这不是一个小问题。因此,有效的方法不是重新发明轮子,而是使用现有的库,如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' }

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.