java - 逐个字段的通用对象比较器

标签 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;
 }

是否有办法改进这段代码?使其更干净、更快或处理我忘记的边缘情况?

最佳答案

您当前的代码使用 ObjectMapper,您也可以使用反射来完成此操作,而不依赖于任何库。不确定这更好,但需要考虑。

我总是在 block 周围加上大括号,甚至是单行线。您稍后可能想在 if 中添加一行阻止并忘记添加大括号。

您选择通过返回 false 来处理带有两个空参数的情况。这是一个深思熟虑的决定吗?您可能想在您的方法中添加一些 JavaDoc 来解释这一点。

我认为您可以将您的方法分成至少 3 个部分,这些部分已由当前代码中的空行指示。这些部分执行不同的操作,因此可以用不同的方法进行处理。

您正在调用map1.get(fieldName)在您的代码中三次(也是 map2 )。我只会调用它一次并将值分配给局部变量。

如果你能让ObjectMapper(我不知道这个类)返回Map<String, Object>你可以避免所有toString稍后在代码中调用。

关于java - 逐个字段的通用对象比较器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40303845/

相关文章:

java - 你能以编程方式访问当前的 Heroku dyno id/name 吗?

java - 这种写作方式?

java - Apache POI 移行

java - JOptionPane 和读取整数 - 初学者 Java

java - 我正在尝试将我的应用程序从 Spring 转移到 Spring Boot,但遇到了一些问题。特别是以下异常

java - 使用接口(interface)作为类型

java - 在将格式应用到 JFormattedTextField 后是否有强制验证的方法?

java - 打印 jeditorpane 时控制字体大小和背景颜色

java - 从 Windows 上下文菜单运行 JAR

java - 数组的浅拷贝,但不是引用的副本