java - 确定两个对象之间的差异

标签 java algorithm object comparison

我正在做类似于审计日志的工作,它需要记录 2 个给定对象之间不同的字段。

例如,我有这两个对象,类 Foo 的 oldFoonewFoo。假设这个类有 20 多个字段。我想知道哪些字段不同 - newFoo 中的哪些字段以前在 oldFoo 中为 null 但没有独行者? newFoo 中哪些字段的值已更改或设置为 null

当然,我总是可以像这样用愚蠢的方式来做:

Map<String, List<Map<String, Object>> diff (Foo oldFoo, Foo newFoo)
{
   Map<String, List<Map<String, Object>> ret = new HashMap<String, List<Map<String, Object>>();
  List<Map<String, Object>> added = new ArrayList<Map<String, Object>>();
  List<Map<String, Object>> changed = new ArrayList<Map<String, Object>>();
  List<Map<String, Object>> removed = new ArrayList<Map<String, Object>>();

  if (newFoo.getField1() != null && oldFoo.getField1() == null)
  {
     added.add(new HashMap<String, Object>().put("fieldName", "field1")
                                            .put("oldValue", "")
                                            .put("newValue", newFoo.getField1());
  }
  else if (newFoo.getField1() == null && oldFoo.getField1() != null)
  {
     removed.add(new HashMap<String, Object>().put("fieldName", "field1")
                                              .put("oldValue", oldFoo.getField1())
                                              .put("newValue", "");
  }
  else if (newFoo.getField1() != null && oldFoo.getField1() != null && !newFoo.getField1().equals(oldFoo.getField1())
  {
     changed.add(new HashMap<String, Object>().put("fieldName", "field1")
                                              .put("oldValue", oldFoo.getField1())
                                              .put("newValue", newFoo.getField1());

  }  

  //keep going for *MORE THAN 20* fields... :(
  //...

  ret.put("CHANGED", changed);
  ret.put("ADDED", added);
  ret.put("REMOVED", removed);
  return ret;

}

但我确信必须有一个聪明的出路。 有什么建议吗?

* 更新 1 * 我尽量避免使用反射。

最佳答案

您可以使用反射来完成整个事情。

只需使用反射扫描对象中的每个字段,并为每个具有不同值的字段构建一个列表。

然后该代码将适用于您喜欢的任何两个对象!

顺便说一句,我会创建一个包含fieldNameoldValuenewValue 字段的Change 类,而不是滥用散列 map 。该类将更清晰/更具可读性、运行速度更快、使用更少内存等。

如果不进行反射(reflection),您的选择将非常有限。您也许可以使用注释做一些事情(扫描注释而不是成员变量)。另一种选择是将类更改为 HashMap 并且根本没有成员变量。

关于java - 确定两个对象之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21298067/

相关文章:

java - 调试java文件编译(使用gwt)

java - 如何将 session 对象放入 HashMap 中

java - 如何在 Wiremock Servlet 上启用响应模板?

java - 将文本文件保存为二进制数据时包含 ÿ 符号的文件

algorithm - 如何更好地理解“每次比较一次”的二进制搜索?

javascript - 如何找到完整的二维数组行行?

javascript - 多级对象 - 基于键的破坏性合并

javascript - 将值分配给另一个具有动态分配键的对象内的对象

java - 与 AWS/alive.json 的 Android HTTPS 连接挂起

c++ - C++ 中的 Bron Kerbosch 算法