Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 确定两个对象之间的差异_Java_Algorithm_Object_Comparison - Fatal编程技术网

Java 确定两个对象之间的差异

Java 确定两个对象之间的差异,java,algorithm,object,comparison,Java,Algorithm,Object,Comparison,我的工作类似于审计日志,它需要记录两个给定对象之间不同的字段 例如,我有两个对象,Foo类的oldFoo和newFoo。假设这个类有20多个字段。我想知道哪些字段是不同的,newFoo中哪些字段以前是oldFoo中的null,但没有单独的字段?newFoo中哪些字段的值被更改或设置为null 当然,我总是可以这样做: Map<String, List<Map<String, Object>> diff (Foo oldFoo, Foo newFoo) { Ma

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

例如,我有两个对象,Foo类的
oldFoo
newFoo
。假设这个类有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;

}

Map您可以使用反射来完成整个工作

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

然后,该代码可以处理任意两个您喜欢的对象

顺便提一下,我会创建一个
Change
类,其中包含
fieldName
oldValue
newValue
字段,而不是滥用哈希映射。该类将更加清晰/可读,运行更快,使用更少的内存,等等


没有反思,你几乎没有选择。您可能能够对注释执行某些操作(扫描注释而不是成员变量)。另一个选择是将类更改为
HashMap
,并且根本没有成员变量。

啊,我应该提到我正在尝试不使用反射。您确实必须使用反射以这种方式访问类的组件。这是一种内在的方式,那么你的运气就差多了。在这里,反射、注释和抛弃类以获得HashMap几乎是您唯一的选择。这正是构建反射的目的,所以我不知道你为什么不使用它…是的,我考虑了一些更改类,而不是
HashMap
,但是,我仍然不喜欢反射的想法,除非这是唯一的方法,这似乎是…:(不幸的是,将主类更改为没有任何成员的
HashMap
选项对我不起作用。反射没有什么可怕的。如果你在做这类事情,你将不得不在某个时候玩它;-)