请注意,您的代码混合了 getter 和字段并引发 NPE。
你真的需要一堆方法还是需要一个更通用的方法?
我强烈希望后者因为一堆有用的方法,你需要一堆调用者并且代码膨胀会激增。
为此,您可以使用反射或注释处理。反射有一些运行时开销(不像以前那么糟糕),但它可以访问私有成员(除非安全管理器禁止)。
像下面这样的事情应该做
public static ImmutableSet<String> differingFields(Object o1, Object o2) throws IllegalAccessException {
checkNotNull(o1);
checkNotNull(o2);
checkArgument(o1.getClass() != o2.getClass());
ImmutableSet.Builder<String> result = ImmutableSet.builder();
for (Field f : o1.getClass().getDeclaredFields()) {
f.setAccessible(true);
if (!Objects.equals(f.get(o1), f.get(o2))) {
result.add(f.getName());
}
}
return result.build();
}
它使用番石榴,因为我更喜欢不可变的结果,但这不是必需的。效率低下来自自动装箱和反射访问,并且很可能是可以接受的。
它仅在传入完全相同类的实例时才有效。它忽略继承的字段。这很容易解决。
MapDifference
您可以返回 Guava或类似名称,而不仅仅是字段名称。differingFields
您可以将对象转换为地图并对其进行处理,而不是实现。