条件Java编译

Sev*_*yev 20 java eclipse conditional-compilation

我是一名长期从事Java的程序员.我正在Eclipse中开发一个Java Blackberry项目.问题 - 有没有办法在项目中引入不同的配置集,然后基于这些编译稍微不同的代码?

在Visual Studio中,我们有项目配置和#ifdef; 我知道Java中没有#ifdef,但可能是文件级别的东西?

mon*_*nny 16

您可以设置'final'字段和ifs以使编译器优化编译的字节代码.

...
public static final boolean myFinalVar=false;
...
if (myFinalVar) { 
 do something ....
 ....
}
Run Code Online (Sandbox Code Playgroud)

如果编译代码时'myFinalVar'为false,那么编译后的类将会遗漏'do something ....'位.如果您有多个条件 - 可以稍微整理一下:将它们全部转移到另一个类(比如'Config.myFinalVar')然后条件都可以保存在一个整洁的地方.

这种机制在'Hardcore Java'中描述.

[其实我认为这与早先发布的"穷人的ifdef"机制相同.]


Pie*_*rre 6

您可以管理不同的类路径,例如,在一组不同的目录中实现每个"Action":

dir1/Main.java
dir2/Action.java
dir3/Action.java
Run Code Online (Sandbox Code Playgroud)

然后为每个版本使用不同的类路径

javac -sourcepath dir1 -cp dir2 dir1/Main.java
Run Code Online (Sandbox Code Playgroud)

要么

javac -sourcepath dir1 -cp dir3 dir1/Main.java
Run Code Online (Sandbox Code Playgroud)


Sha*_*mik 6

在JDK6中,您可以使用Java的ServiceLoader接口来完成.检查它在这里.


Jer*_*ond 6

如果你想专门用于BlackBerry,BlackBerry JDE有一个预处理器:

您可以通过更新Eclipse™配置文件为应用程序启用预处理.

在C:\ Program Files\Eclipse\configuration\config.ini中,添加以下行:osgi.framework.extensions = net.rim.eide.preprocessing.hook如果在进行构建后启用预处理,则必须清除在再次构建项目之前,从"项目"菜单中选择项目.

然后你可以在代码中做一些事情:

//#ifdef SOMETHING
// do something here
//#else
// do something else
//#endif
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅指定预处理器定义


Nat*_*hes 3

不,Java 没有与该功能完全匹配的功能。您可以使用方面,或使用 IOC 容器来注入不同的实现类。