[英]Simple/elegant way to do object to object transformation in Java?
我必須接管並改進/完成一些將Java對象從第三方庫轉換為內部對象的代碼。 目前,這是通過以下類似的大if-else語句完成的:
if (obj instanceOf X)
{
//code to initialize internal object
}
else if (obj instanceOf Y)
{
//code to initialize different object
}
else if (obj instanceOf Z)
{
//more init code
}
...
我個人認為這種解決方案並不令人滿意。 它很長而且很凌亂,更糟的是,許多if-else塊包含更多的if-else塊,用於處理子類和邊緣情況。 有沒有更好的解決方案來解決這個問題?
創建一個這樣的界面
public interface Converter<S,T> {
public T convert(S source);
}
並為X,Y,Z的每個對象實現它。 然后將所有已知的轉換器放入地圖中,並開心起來!
雖然不適用於極端情況,但可以在類和轉換器之間建立映射
X.getClass()-> X轉換器
Y.getClass()-> Y轉換器
會讓您更接近。 如果還沒有找到葉子類,您還想檢查超類。
像這樣的代碼,以及所有的instanceof
條件,都會讓接口大叫!
您可能需要使用方法public void initialize()
創建public interface Initializable
。
然后,如果只是將if-else解析為一個obj.initialize()
調用,那么所有這些。
如果這些內部對象提供了到應用程序的接口,而不是直接使用它們,請對其進行調整而不是對其進行轉換。
也就是說,如果您有這樣的事情:
public class ThirdPartyClass { ... }
public interface InternalInterface { ... }
public class InternalClass { ... }
Internal foo(ThirdPartyClass thirdParty) {
InternalClass internal = new InternalClass();
// convert thirdPaty -> internal
return internal;
}
然后改為執行以下操作:
public class ThirdPartyClass { ... }
public interface InternalInterface { ... }
public class InternalClass { ... }
public class ThirdPartyInternalAdapter implements InternalInterface {
private final ThirdPartyClass thirdParty;
public ThirdPartyInternalAdapter(ThirdPartyClass thirdParty) {
this.thirdParty = thirdParty;
}
// implement interface in terms of thirdParty
}
從您的問題尚不清楚這是否適用,但是如果適用,這可能比直接的對象到對象的轉換更容易,更有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.