通用对象比较器按字段

时间:2016-10-28 11:11:07

标签: java

为了好玩,我想尝试按字段,通用对象比较器实现一个字段,这就是我所做的:

 private Boolean isEqualFiedByField(Object o1, Object o2){
   if (o1 == null || o2 == null || o1.getClass() != o2.getClass())
     return false;

   ObjectMapper mapper = new ObjectMapper();
   Boolean result = true;
   Map map1 = mapper.convertValue(o1, Map.class);
   Map map2 = mapper.convertValue(o2, Map.class);

   for (Object field : map1.keySet()) {
     String fieldName = field.toString();
     if (map1.get(fieldName) != null && map2.get(fieldName) != null)            
       result &= map1.get(fieldName).toString().equals(map2.get(fieldName).toString());
     else
       result &= (map2.get(fieldName) == map1.get(fieldName));
   }
   return result;
 }

无论如何改进此代码?让它更干净,更快或处理我忘记的边缘情况?

1 个答案:

答案 0 :(得分:4)

您当前的代码使用ObjectMapper,您也可以使用反射执行此操作,而不依赖于任何库。不确定哪个更好,但需要考虑的事情。

我总是把围栏放在块上,甚至是单行。您可能稍后想要在if块中添加一行,忘记添加大括号。

您选择通过返回false来处理具有两个空参数的情况。这是一个刻意的决定吗?您可能希望在您的方法上添加一些JavaDoc来解释这一点。

我认为你可以将你的方法分成至少3个部分,已经用当前代码中的空行表示。这些部分做了不同的事情,因此可以用不同的方法处理。

您在代码中调用map1.get(fieldName)三次(同时map2)。我只会调用它一次并将值赋给局部变量。

如果您可以使用ObjectMapper(我不知道该课程)来返回Map<String, Object>,则可以避免代码中的所有toString次调用。