Java 确定两个对象之间的差异
我的工作类似于审计日志,它需要记录两个给定对象之间不同的字段 例如,我有两个对象,Foo类的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
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
选项对我不起作用。反射没有什么可怕的。如果你在做这类事情,你将不得不在某个时候玩它;-)