2014-01-23 42 views
1

我正在类似于审计日志,它需要记录两个给定对象之间不同的字段。确定两个对象之间的差异

例如,我有Foo类的这两个对象oldFoonewFoo。假设这个班有20多个领域。我想知道哪些字段是不同的 - newFoo以前的nulloldFoo中的字段是什么,但没有孤独者? 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 * 我尽量避免使用反射尽可能多。

回答

0

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

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

该代码可以与任何你喜欢的任何两个对象一起工作!

顺便我想创建一个ChangefieldNameoldValuenewValue字段,而不是滥用哈希映射了点。课程将更加清晰/更具可读性,运行速度更快,使用更少的内存等。

没有反思,你有很少的选择。您可以使用注释做一些事情(扫描注释而不是成员变量)。另一种选择是将类更改为HashMap,并且根本不具有成员变量。

+0

啊,我应该提到我试图不使用反射。 – 0x56794E

+0

你真的必须以这种方式使用反射来访问类的组件。这是**内置的方式来做到这一点。 – user2282497

+0

然后你几乎不走运。反射,也许注释,和抛弃你的类的HashMap几乎是你唯一的选择。这正是反射所建立的东西,所以我不知道你为什么不使用它... –