1
我正在类似于审计日志,它需要记录两个给定对象之间不同的字段。确定两个对象之间的差异
例如,我有Foo类的这两个对象oldFoo
和newFoo
。假设这个班有20多个领域。我想知道哪些字段是不同的 - newFoo
以前的null
oldFoo
中的字段是什么,但没有孤独者? 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 * 我尽量避免使用反射尽可能多。
啊,我应该提到我试图不使用反射。 – 0x56794E
你真的必须以这种方式使用反射来访问类的组件。这是**内置的方式来做到这一点。 – user2282497
然后你几乎不走运。反射,也许注释,和抛弃你的类的HashMap几乎是你唯一的选择。这正是反射所建立的东西,所以我不知道你为什么不使用它... –