0

私はアイテムのリストを持っています...

public class Item implements Serializable {
   private Double subTotalCash;
   private Double subTotalCredit;
   private Double totalShipping;
   private Double grandTotal;

   private Integer countSubItems;
   private Integer countSomethingElse;
   private Integer countMoreThingsNotListedHere;

   ...
   // getters and setters here
}

重要なすべてのパラメーターは、Double、Integer、Float、または Long (すべて Number 拡張) です。私がやりたいことは、各パラメーターを合計し、それらを 1 つの「マスター」アイテムに合計することです。

Item masterItem = new Item();
for(Item item:items) {
   addValuesFromItemToMaster(item, master);
}

値が 10 個ほどしかない場合は大したことではありませんが、多数のパラメーターについて話しているため、パラメーターが頻繁に変更されるため、Item オブジェクトが変更されたときにこのコードを更新することを覚えておく必要はありません。変更....だから、リフレクションを使用して Number から割り当て可能なすべてのフィールドを取得し、それらを合計すると思いましたが、実際の加算はどうすればよいですか?

private void addValuesFromItemToMaster(Item child, Item master) throws Exception {
    if(child == null || master == null) return;

    Field[] objectFields = master.getClass().getDeclaredFields();
    for (Field field : objectFields) {
        if (java.lang.reflect.Modifier.isStatic(field.getModifiers())) continue; // don't add any static fields
        if(!Number.class.isAssignableFrom(field.getType())) continue;  // If this is not a numeric field
        if(field.getType() == AtomicInteger.class || field.getType() == AtomicLong.class || field.getType() == Byte.class || field.getType() == BigInteger.class) continue;

        Number childValue = (Number)PropertyUtils.getProperty(child, field.getName());
        Number masterValue = (Number)PropertyUtils.getProperty(master, field.getName());

        if(childValue == null) continue;
        if(masterValue == null) masterValue = childValue;

        // is there something I can put here to get the masterValue += childValue?
        // is there a way to cast to the field.getType()?

        BeanUtils.setProperty(master, field.getName(), n);
    }
}
4

2 に答える 2