2016-01-04 20 views
0

如何在Java中合併2個大型相同的POJO(〜40個字段)?如何在java中合併兩個大的POJO?

Satellite A: [name = ISS, period = 0.9, inclination = 0.8, launch_date=2016-01-04, launch_vehicle=null, has_propulsion=null] 

Satellite B: [name = International Space station, period= 0.91, inclination =0.802, launch_vehicle=BOAT, has_propulsion=false] 

進入

Satellite C: [name = ISS, period = 0.9, inclination = 0.8, launch_date=2016-01-04, launch_vehicle=BOAT, has_propulsion=false] 
+1

爲什麼不是一個具有所有字段的構造函數,並將其設置爲非空值?我不明白這是多麼複雜...... – m0skit0

+0

我不想手動輸入+ - 40個字段。如果添加更多字段或名稱更改會怎麼樣? – Frank

+0

你爲什麼要那樣做?任何你會失去信息的方式。無論如何,如何做到這一點取決於你的要求,它不應該取決於我們的意見。 – Stultuske

回答

1

我會去一個構造函數,例如:

public MergedSatellite(final Satellite one, final Satellite other) { 
    setOffName((one.getOffName() == null) ? other.getOffName() : one.getOffName()); 
    // And so on for all fields 
} 

編輯:請注意,這將主要oneother當現場存在於兩個實例上。您可能需要考慮更多關於合併過程的邏輯。

+0

你將如何處理兩個都有價值的領域? – Stultuske

+0

@Stultuske我認爲我發佈的構造函數已經回答你的問題。 'other'勝過'one',儘管你可以放更多的邏輯來處理這種情況。 – m0skit0

+0

ok thx,所以在你看來,+40行代碼是要走的路?對不起,我沒有在Java中經驗豐富,並想從專業人士那裏學習:-) – Frank

0

真的取決於你正試圖解決的問題。合併的約束和條件是什麼?

一種解決方案可能是將兩個類封裝在類C中,並對每個get方法使用三元運算符,但代碼至少可以讀取而不是冗長。 return isNotBlank(a.getName())?a.getName():b.getName();

還有其他的選擇,比如使用java反射,一般不推薦。

3

好,使用反射它會是這樣的:

public static Satellite merge(Satellite s1, Satellite s2) throws Exception { 

    Satellite merged = new Satellite(); 

    for (Field field : Satellite.class.getDeclaredFields()) { 
     field.set(merged, field.get(s1) != null? field.get(s1) : field.get(s2)); 
    } 

    return merged; 
} 

但我認爲這是absolutelly一個壞的(危險和慢)的方法。其實,我會爲m0skit0解決方案,但首先請打破你的課堂。你不應該有一個類〜40場...

+0

這有什麼危險?也許因爲他們是Pojo,應該使用'BeanIntrospector'並在'merged'上調用setter方法。 – SpaceTrucker