如何“合并”两个bean,但总结数值

时间:2012-03-16 19:04:36

标签: java

如果我有一个像

这样的bean
public 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;双倍,随着业务需求的变化,这些可能会随着时间而变化。维护一个按名称处理每个函数的函数并不太吸引人。

2 个答案:

答案 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);
}