当前位置: 首页 > 知识库问答 >
问题:

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

孟自强
2023-03-14

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

public class Member {
    String firstName;
    String lastName;
    String driverLicenseNumber;
    Integer age;
    LocalDateTime timestamp;
}
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表中的每一对记录。代码将非常大,以比较每个字段,并乘以不同的实体。有没有更好更高效的办法?

共有1个答案

徐峰
2023-03-14

如果你扩展思想来比较对象图,这不是一个琐碎的问题。因此,有效的方法不是重新发明轮子,而是使用现有的库,如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' }
 类似资料:
  • 我有三节课: 人类 父亲 孩子。 儿童阶级延伸父亲,父亲延伸人类。 我已经创建了每个类的一些实例并将它们存储到ArrayList中。 现在,我想编写一个方法来检查对象father1是否与对象child1地址字段(类Father和Child的实例)具有相同的字段地址(例如:“21 str Goodwin”),并将此方法提供给我的ArrayList,如果发现任何结果,则打印。 我怎么能这样呢? 为了更

  • 问题内容: 我有两个对象,每个对象都有数十个字段: 尽管某些字段的名称不同,但是它们应该具有相同的含义和目的,例如和。我想比较两个类的对象的“相似”字段实际上是否具有相同的值。最优雅的方法是什么? 问题答案: 如果有两个类的字段具有相似的含义,则可以考虑声明一个。 并且具有默认实现: 有被覆盖的风险-确保它永远不会发生。

  • 问题内容: JDK中是否有一种方法比较两个对象的相等性(是否为空)?像这样: 自己编写此方法似乎很愚蠢,因为我认为它必须已经存在于某个地方。 问题答案: Java 7.0添加了一个新的便捷类:。 它有一个专门用于此的方法:

  • 我有两个对象类Person和Employee。两个类都有共同的属性年龄。我已经在Arraylist中添加了这两个类的几个对象,现在我需要两个,写一个比较器,并将其传递给集合类的sort方法。并希望列表按年龄排序。我尝试这样做只是为了更清楚地使用Java中的carparable和Comparator。 编辑:我问这个问题的原因是我不清楚比较者和可比性。我在某个地方读到,如果类实现了可比较的,那么它就

  • 为了单元测试DTO,我想使用AssertJ的递归比较来比较两个对象(DTO和一个实体)- 我尝试过以下配置,但运气不佳: 比较阶级: DTO: 实体: 在这种情况下,如何配置assertJ?

  • 问题内容: 我得到的错误就在这行 。 该怎么办?其他逻辑还可以吗? 我想做的是有一个A列表和一个B列表,其中一个属性与id相同;尽管变量名不同。即在和在B。现在我将两个列表都放在ListAll中,并在相同的变量id / bid上对它们进行排序。我有A和B实现可比性。 和我的listAll是对象类型? 我该怎么做?谢谢。 问题答案: 您可以添加一个通用基类并在那里进行比较,如下所示: