2015-06-14 93 views
4

我可以以某種方式將所有字段值從一個對象移動到另一個對象而不使用使用反射?所以,我想要做的是這樣的:將所有字段從一個對象移動到另一個對象

public class BetterThing extends Thing implements IBetterObject { 
    public BetterThing(Thing t) { 
     super(); 
     t.evolve(this); 
    } 
} 

因此,evolve方法將演變一類到另一個。一個參數將是<? extends <? extends T>>其中T是對象的類,您打電話evolve

我知道我可以用反射做到這一點,但反射會傷害到性能。在這種情況下,Thing類在外部API中,並且沒有方法可以將所有必需的字段從它複製到另一個對象。

+4

您的選擇是(a)反思或(b)明確的成員分配。 –

+1

...或從繼承切換到組合。 – aioobe

+0

如果你說Thing在外部API中,我猜它裏面沒有進化方法。 – AdamSkywalker

回答

5

正如@OliverCharlesworth所指出的,它不能直接完成。你將不得不求助於反思(雖然我不會推薦它!)或一系列逐場分配。

另一種選擇,雖然,將從繼承切換到組合物:

public class BetterThing implements IBetterObject { 
    Thing delegate; 

    public BetterThing(Thing t) { 
     this.delegate = t; 
    } 

    // Thing methods (delegate methods) 
    String thingMethodOne() { 
     return delegate.thingMethodOne(); 
    } 

    // BetterThing methods 
} 

這通常被稱爲decorator pattern

請參見:Prefer composition over inheritance?

+0

這實質上是一個[裝飾者](https://en.wikipedia.org/?title=Decorator_pattern)? – jaco0646

+0

@ jaco0646:它對我來說很像。 1+ –

+0

@ jaco0646,是的,謝謝。添加了這個答案。 – aioobe

0

您應該嘗試通過使用通過緩存結果來加速反射操作的庫來儘量降低性能影響。看看Apache common-beanutilsDozzer

0

你可以這樣的方式,這將是更便宜的使用反射。我創建了一個應用程序,當我第一次運行程序時,我將屬性名稱和getter和setter方法保存在地圖中,當我需要提取屬性時,我只是調用那些傳遞對象的方法來調用它。與需要克隆時每次使用反射獲取方法對象相比,這具有良好的性能。

另一種方式可能是使用像Jackson這樣的序列化器,但是這將是一個昂貴的序列化和反序列化任務。

相關問題