[英]How can I exclude annotated definition from build in java?
我正在構建一個Android應用程序。 現在,我有API#1的源代碼,我應該將其改編為API#2。 然后,我將在不同的程序包中發布API#1和API#2的兩個版本。 我不能使用values-en之類的東西,因為這兩個版本均可在全球范圍內使用。 同樣,用戶可能沒有選擇權。
由於新版本將使用相同的UI和DB邏輯,並且(因為現在的代碼是錯誤的),我不想分離代碼。 如果我使用C或C ++進行編碼,則必須使用#ifdef和Makefile。 但是,我在Java中。 可以通過在運行時確定包名稱來運行與API相關的代碼,但這有點奇怪。
我想我可以使用注釋。 我期望的是:
package foo.app;
public class API {
public boolean prepare() { ... }
@TargetPlatform(1)
public void open() { ... }
@TargetPlatform(2)
public void open() { ... }
}
並只使用其中之一。 另外,這很好:
package foo.app;
public class R {
@TargetPlatform(1) com.example.foo.app.R R;
@TargetPlatform(2) net.example.foo.app.R R;
}
僅定義注釋很簡單。 我不知道的是,如何從構建或執行中排除未使用的重復項? 如果可以通過這種方式完成工作,我可以做任何事情。
您不能為此使用注釋。
將實現特定的類隱藏在接口后面會更好。
public interface Api {
boolean prepare();
void open();
}
要創建Api
實例,請使用工廠類:
public class ApiFactory {
public static Api createApi() {
if(isTargetPlatform1())
return new com.example.foo.app.Api();
else
return new net.example.foo.app.Api();
}
private boolean isTargetPlatform1() {
// determine the current platform, e.g. by reading a configuration file
}
}
在所有其他地方,您僅引用Api
接口和ApiFactory
類。 像這樣使用它:
Api api = ApiFactory.createApi();
api.open();
// ...
一個更高級的解決方案是使用依賴注入 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.