如何从java中的build中排除带注释的定义?

时间:2013-08-06 01:58:34

标签: java annotations

我正在制作Android应用。现在,我有一个API#1的源代码,我应该适应API#2。然后,我将在不同的包中发布API#1和API#2的两个版本。我不能使用像value-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;
}

仅定义注释很简单。我不知道的是,如何从构建或执行中排除未使用的重复项,等等?如果可以这样做,我可以做任何事情。

1 个答案:

答案 0 :(得分:0)

您无法使用注释。

最好在接口后面隐藏特定于实现的类。

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();
// ...

更高级的解决方案是使用dependency injection