2009-01-07 94 views
1

我必須接管並完善/完成一些將Java對象從第三方庫轉換爲內部對象的代碼。目前,這是通過一個大的if-else語句的線沿線的完成:在Java中做對象轉換的簡單/優雅的方法?

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塊。有沒有更好的解決這個問題?

+0

可能,但沒有更多關於您獲得的對象的信息以及您基於它們執行的初始化類型,很難說 - 這是「依賴於」的答案之一。 – Rob 2009-01-07 19:47:19

回答

6

創建這樣

public interface Converter<S,T> { 
    public T convert(S source); 
} 

的接口,並實現它爲X,Y,Z的每一個對象。然後把所有已知的轉換器放到一個Map中並且開心!

+0

這並沒有什麼幫助,因爲泛型類型是靜態的,所以你仍然需要做一堆instanceof來使用正確的Convert實例。 – cletus 2009-01-07 20:33:21

0

雖然它並不適用於邊緣的情況下工作,建築類和轉換器

X.getClass()之間的映射 - > X轉換
Y.getClass() - > Y轉換

會讓你更接近你。如果葉類沒有找到,你也想檢查超類。

0

這樣的代碼,其所有instanceof條件,尖叫的接口!

您可能想要創建一個public interface Initializable,方法public void initialize()

然後所有如果你的if-else的只是解析成一個單一的obj.initialize()調用。

0

如果這些內部對象爲應用程序提供了一個接口,而不是直接使用,則可以對它們進行調整而不是轉換它們。

也就是說,如果你有這樣的事情:

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 
} 

這不是從你的問題不清楚這是否適用,但如果它這樣做可能比直接的對象到對象的轉換更容易和更有效。

相關問題