我有两个相同类型的域对象.它们包含枚举,原始数组和其他对象,也是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 /编译器 – 但它显示了一般方法)