java – 尝试比较两个对象并提取包含它们差异的第三个对象

我有两个相同类型的域对象.它们包含枚举,原始数组和其他对象,也是Heirarchy中的列表.

我需要一些东西来提取同一类型的第三个只包含它们的差异的对象,几乎就像一个只包含它们的变化的面具.并且任何未更改的内容都将设置为null.

一切都指向Apache BeanUtils,但我无法找到我正在寻找的,任何建议?

编辑#1
示例澄清:
如果obj1是原始版本,则obj2是更新版本.然后,如果obj1.value等于obj2.value,则obj3.value将为null.如果obj1.value不等于obj2.value,那么obj3.value将被设置为obj2.value的值

编辑#2
理想情况下,它应该是抽象的,并且无需知道正在运行比较的对象类型.因为这可以在将来用于不同的对象.
如果其中一个更新值设置为null,则可以将其忽略,就好像它不是更改一样.

最佳答案 它可以在没有任何外部库的情况下完成;)

我们来看一个琐碎的豆子吧

public class Bean {
  public String value;
  public List<String> list;
  public String[] array;
  public EnumType enum;
}

并添加一个静态(工厂)方法:

public static Bean createDelta(Bean master, Bean variant) {
  Bean delta = new Bean();

  // fields are simple
  if (!master.value.equals(variant.value))
     delta.value = variant.value;

  // enums are simple too
  if (master.enumValue != variant.enumValue)
     delta.value = variant.value;

  // for arrays .. it get's slightly difficult, because arrays may vary in size
  int size = master.array.length > variant.array.length ? 
               master.array.length : variant.array.length;
  delta.array = new String[size];
  for (int i = 0; i < size; i++) {
    if ((i >= master.array.length) || 
        (!master.array[i].equals(variant.array[i]))) {
       delta.array[i] = variant.array[i];

  // same pattern for lists - except we have to add null
  int size = master.array.length > variant.array.length ? 
               master.array.length : variant.array.length;
  delta.list = new ArrayList<String>();
  for (int i = 0; i < size; i++) {
    if ((i >= master.array.length) || 
        (!master.array[i].equals(variant.array[i]))) {
       delta.list.add(variant.get(i));
    } else {
       delta.list.add(null);
    }
  }
}

(注意 – 未经过测试,手头没有IDE /编译器 – 但它显示了一般方法)

点赞