【问题标题】:How to efficiently compare two objects of same Class and check which are the fields that differ?如何有效地比较同一类的两个对象并检查哪些字段不同?
【发布时间】:2019-07-17 15:43:22
【问题描述】:

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

众多实体类中的一个可以说是如下的成员

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

在数据库中,我有一个名为 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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-02-16
      • 1970-01-01
      • 1970-01-01
      • 2022-12-06
      • 2014-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-03
      相关资源
      最近更新 更多