如果我有一个像
这样的beanpublic class SimpleBean
{
private String name;
private int int1;
private int int2;
private double double1;
private double double2;
// getters/setters snipped
}
将bean的两个实例合并为一个的最佳方法是什么,我们只想将第二个bean实例中的数值添加到第一个(即我们不关心上面的String'名称)
我使用PropertyUtils提出了以下解决方案,但我认为它可能不是最好的
public void mergeStats(Object stat)
{
try
{
Map<String, Object> beanMap = PropertyUtils.describe(stat);
// Remove ones we don't want to merge
beanMap.remove("name");
beanMap.remove("class");
for (Map.Entry<String, Object> entry:beanMap.entrySet())
{
String key = entry.getKey();
Number value = (Number) entry.getValue();
Number existingValue = (Number) PropertyUtils.getProperty(this, key);
BeanUtils.setProperty(this, key, existingValue.doubleValue() + value.doubleValue());
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
编辑:我还要补充说,我们项目的真正的bean包含大约100个整数&amp;双倍,随着业务需求的变化,这些可能会随着时间而变化。维护一个按名称处理每个函数的函数并不太吸引人。
答案 0 :(得分:2)
除非你正在构建一个框架,否则我不鼓励使用BeanUtils或一般的反射来完成这类任务。它没有给你任何灵活性(无论何时将某些内容添加到SimpleBean
),你仍然必须自己命名你不想包含的字段。
显式添加属性具有可预测的优势,并且 - 如果它们变得众多 - 重新考虑设计:可能应该使用数组?
否则,为了改进当前的解决方案,您可以使用PropertyUtils.getPropertyDescriptor(...).getPropertyType()
检查属性的类型,从而发现它是否可以安全地转换为java.lang.Number
或其他原始包装类。 / p>
答案 1 :(得分:1)
向bean添加方法:
public SimpleBean mergeWith(SimpleBean other) {
return new SimpleBean(this.name,
int1 + other.int1,
int2 + other.int2,
double1 + other.double1,
double2 + other.double2);
}