2012-03-16 18 views
1

數值如果我有一顆豆,如如何「合併」兩種豆,但總結裏面

public class SimpleBean 
{ 
    private String name; 
    private int int1; 
    private int int2; 
    private double double1; 
    private double double2; 

    // getters/setters snipped 
} 

什麼是bean的兩個實例合併爲一個,在這裏我們只是想最好的辦法將第二個bean實例的數值添加到第一個(即我們不關心上面的字符串'名稱')

我已經想出了使用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(); 
    } 
} 

編輯:我還補充一點,我們的項目真正的豆含有大約100個整數&雙打,並隨着業務需求的改變那些可以隨時間而改變。維護一個按名稱處理每個函數的函數並不太吸引人。

回答

2

除非你正在構建一個框架,我會勸阻使用的BeanUtils,或反映在一般情況下,這種任務的。它沒有給你任何靈活性(只要有東西被添加到SimpleBean),你仍然必須爲你自己不想包含的字段命名。

添加屬性明確的具有可預見的優勢,—如果他們成爲衆多—重新考慮設計:也許應該使用數組?否則,爲了改進您當前的解決方案,您可以檢查PropertyUtils.getPropertyDescriptor(...).getPropertyType()的屬性類型,從而發現它是否可以安全地轉換爲java.lang.Number或其他基本包裝類。

+0

爲什麼的BeanUtils/PropertyUtils灰心?這是性能的原因?我之所以把它當作第一遍使用,是因爲它的靈活性。我可以添加/刪除int/double字段,而不必修改合併函數。 – 2012-03-16 20:14:47

+1

@CollinPeters如果屬性必須手動添加反正,有一個在它添加到求和函數沒有大的工作。我不鼓勵BeanUtils,因爲它們給代碼帶來了不確定性。如果我是你,我把它倒過來:我會寫所有的代碼** **明確,但我會用BeanUtils的檢查,如果所有的號碼屬性總結寫**單元測試** 。 – MaDa 2012-03-18 20:27:33

+0

是砰的一聲。混凝土類應該有每場宣佈,單元測試應該使用的BeanUtils – 2012-03-20 00:11:52

1

添加一個方法來豆:

public SimpleBean mergeWith(SimpleBean other) { 
    return new SimpleBean(this.name, 
          int1 + other.int1, 
          int2 + other.int2, 
          double1 + other.double1, 
          double2 + other.double2); 
} 
+0

我已經更新了我的問題澄清,我有接近100個整數和雙打在我的課。如果我有一個小的已知組合,我會選擇這種方法。 – 2012-03-16 20:15:32

+0

那麼,如果你能夠在類中聲明和使用這100個數字,你應該能夠將它們複製到另一個實例。 – 2012-03-16 22:57:53