我遇到了一个问题,即根据用户所做的更改来更新现有数据。
例如,我有一个公司对象,如下所示
public class Company {
private String id;
private String name;
private String url;
//Getter and setter.....
}
现在我有一个公司实例,数据如下
Company company = new Company();
company.setId("id12345678");
company.setName("company Old Name");
company.setUrl("company Old Url");
现在,用户已创建另一个公司实例,只是为了更新现有name
的{{1}}和url
Company
可以看出,Company newCompany = new Company();
newCompany.setId("id12345678");
newCompany.setName("company New Name");
newCompany.setUrl("company New Url");
的新实例与旧版Company
具有相同的Id
,但name
和url
不同。
是否有任何实用工具/库可以简单地找到这两个对象之间的所有差异并将更改应用于company
实例? (实际上并不想编写代码来手动比较每个字段)
像
这样的东西company = AwesomeLibraryUtils.compareAndApplyDifferences(company, newCompany);
在此之后,company
实例保持相同的ID,但name
和url
实例的所有新值都为newCompany
和 public function getOrderData()
{
$orders = Mage::getResourceModel('sales/order_collection')
->addFieldToSelect('*')
->addFieldToFilter('customer_id', Mage::getSingleton('customer/session')->getCustomer()->getId())
->setOrder('created_at', 'desc');
$this->setOrders($orders);
$i = 1;
$data[] = '--- Please Select ---';
foreach ($orders as $order):
$data[$order->getRealOrderId()] = $order->getRealOrderId();
$i++;
endforeach;
return $data;
}
。
感谢。
答案 0 :(得分:2)
使用reflect查找公司和newCompany中getter和setter的所有结果。
基本上,我在这里做的如下:
1。将newCompany中getter的所有结果放入名为hm的HashMap中。
2。浏览公司中的getter结果。如果hm不包含公司中任何一个getter的结果,那么这两家公司被认为是不同的。
3。如果两家公司不同,请将公司中的值设置为newCompany中的值。
public static void compareAndApplyDifferences(Object o1, Object o2) {
if(!o1.getClass().equals(o2.getClass())) {
return;
}
// check if the result of getters in o1 and o2 are different
boolean isDiff = false;
Class<? extends Object> c1 = o1.getClass();
Class<? extends Object> c2 = o2.getClass();
Method[] methods1 = c1.getMethods();
Method[] methods2 = c2.getMethods();
Map<String, Object> hm = new HashMap<String, Object>();
for (Method method2 : methods2) {
if (isGetter(method2)) {
try {
Object getterResult = method2.invoke(o2);
hm.put(method2.getName().substring(3), getterResult);
} catch (IllegalAccessException e) {
} catch (IllegalArgumentException e) {
} catch (InvocationTargetException e) {
}
}
}
for (Method method1 : methods1) {
if (isGetter(method1)) {
try {
String getterResult = (String) method1.invoke(o1);
if (!hm.containsValue(getterResult)) {
isDiff = true;
break;
}
} catch (IllegalAccessException e) {
} catch (IllegalArgumentException e) {
} catch (InvocationTargetException e) {
}
}
}
if (isDiff) {
// set the values in o1 as the values in o2
for (Method method1 : methods1) {
if (isSetter(method1)) {
try {
method1.invoke(o1, hm.get(method1.getName().substring(3)));
} catch (IllegalAccessException e) {
} catch (IllegalArgumentException e) {
} catch (InvocationTargetException e) {
}
}
}
} else {
return;
}
}
private static boolean isGetter(Method method) {
if (!method.getName().startsWith("get"))
return false;
if (method.getParameterTypes().length != 0)
return false;
if (void.class.equals(method.getReturnType()))
return false;
return true;
}
private static boolean isSetter(Method method) {
if (!method.getName().startsWith("set"))
return false;
if (method.getParameterTypes().length != 1)
return false;
return true;
}
这是我的计划的演示:
public static void main(String[] args) {
Company company = new Company();
company.setId("id12345678");
company.setName("company Old Name");
company.setUrl("company Old Url");
Company newCompany = new Company();
newCompany.setId("id12345678");
newCompany.setName("company New Name");
newCompany.setUrl("company New Url");
AwesomeLibraryUtils.compareAndApplyDifferences(company, newCompany);
System.out.println(company.getId()); // id12345678
System.out.println(company.getName()); // company New Name
System.out.println(company.getUrl()); // company New Url
}
答案 1 :(得分:1)
没有真正的实用工具可以找到并应用&#34;差异(据我所知),然而,有反射(如其他所说),如Apache Comparator(这是一个强大的类)。
至于&#34;应用差异&#34;,Apache中还有一个工具(BeanUtils):http://commons.apache.org/proper/commons-beanutils/这是&#34; copyProperties(Object o1, Object o2)
&#34; wihchi会将所有属性(字段)从一个对象复制到另一个对象。
因此,您只需要比较对象,如果它们是差异,则将其中一个复制到另一个中。
除了性能问题之外,我不明白为什么你只复制不同的字段(因为如果你复制相同的字段,那么就没有任何区别)。如果你只需要复制不同的字段,我想你必须自己制作工具。
答案 2 :(得分:0)
您应该覆盖equals()
方法。之后,您将能够检查条件company.equals(newCompany)
着名的IDE支持自动生成equals方法。例如,IDEA将其生成为:
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Company company = (Company) o;
if (id != null ? !id.equals(company.id) : company.id != null) return false;
if (name != null ? !name.equals(company.name) : company.name != null) return false;
return !(url != null ? !url.equals(company.url) : company.url != null);
}