簡體   English   中英

如何從Java構建中排除帶注釋的定義?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM