我正在制作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;
}
仅定义注释很简单。我不知道的是,如何从构建或执行中排除未使用的重复项,等等?如果可以这样做,我可以做任何事情。
答案 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。