只是为了好玩,我想尝试逐个字段地实现通用对象比较器,这就是我所做的:
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/