2011-11-18 32 views
2

我需要在兩個diffwrent平臺-SDK上使用相同的類。java中的預編譯器開關:如何更改導入類的路徑

雖然類和它的方法是相同的,但訪問類的路徑卻不同。 在一個設備,我需要使用:

進口a1.a2.classname

而第二設備,我需要使用:

進口b1.b2.b3.classname

請不要問我爲什麼:我沒有編寫SDK,我不能改變它們。

所以問題是:你會怎麼做?有沒有辦法在不同的sdk版本上導入同一個類的不同版本?

在C++中,我會用預編譯器開關,如:

#ifdef SDK1 
#include "path1/class.h" 
#else 
#include "path2/class.h" 
#endif 

你將如何在Java中做到這一點?

請考慮,我不能從類派生的,因爲我只能訪問其界面和方法的數量太大,考慮使用代理

+0

這會寫你做出多個版本。如果您使用'Class.forName()',則可以爲兩者使用一個版本,並在運行時選擇差異。 (應用程序可以根據使用情況檢測導入哪一個) –

+0

問題是,在我使用該類的所有類中,我必須添加對於不同SDK的不同導入。這是真的,除非我把這個類包裝在我想要避免的代理中 – kingston

+0

我傾向於避免多個構建,因爲一旦你開始走這條路,這會變成一場噩夢。 –

回答

2

你可以寫一個光代理層和檢查哪些類可用於Class.forName()。如果將來您的兩個班級在簽名等方面會出現分歧,那麼這就是要走的路。

但是,如果您完全確定它們將始終保留相同的功能,那麼只需在構建工具中搜索並替換有問題的所有導入實例即可。在maven中你可以使用資源過濾,this question就有一個例子。

+0

對,但我試圖避免寫一個代理,因爲類有很多方法:它很無聊... – kingston

+0

@ user38我意識到,因此第二段。那麼不是一個可接受的解 – wds

+0

最後我寫了一些代理。我認爲使用Maven也是合理的。不要厭倦編寫代理我使用正則表達式自動將eclipse生成的存根轉換爲調用「真實主題」實例的實現:-) – kingston