条件Java编译

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

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

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

... public static final boolean myFinalVar=false; ... if (myFinalVar) { do something .... .... } 

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

这种机制在’Hardcore Java’中描述。

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

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

 dir1/Main.java dir2/Action.java dir3/Action.java 

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

 javac -sourcepath dir1 -cp dir2 dir1/Main.java 

要么

 javac -sourcepath dir1 -cp dir3 dir1/Main.java 

如果你想专门用于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 

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

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

一个人可以称之为穷人的ifdef : http : //www.javapractices.com/topic/TopicAction.do ? ifdef = ifdef

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

您可以将m4集成到构建过程中,以有效地将模拟带到Java编译器前面的C预处理器。 在“集成”步骤中挥舞着许多手,但m4是文本处理工作的正确技术。

除了Maven,Ant和其他提供类似function的构建工具之外,人们宁愿在Java中构建接口并在运行时切换实现。
有关详细信息,请参阅策略模式

与C / C ++相反,这不会带来很大的性能,因为Javas JIT编译器在运行时进行了优化,并且能够在大多数情况下内联这种模式。
这种模式的最大优点是灵活性 – 您可以在不触及核心类的情况下更改底层实现。

您还应该检查IoC和观察者模式以获取更多详细信息。

您可以在组合mit公共静态最终字段中使用maven的资源过滤,这将确实有条件地进行编译。

 private static final int MODE = ${mode}; ... if (MODE == ANDROID) { //android specific code here } else { } 

现在你需要为你的maven pom添加一个名为“mode”的属性,它应该与你的ANDROID常量具有相同的值。

java编译器应该(!)删除if和else块,从而留下你的android代码。

不是testet,所以没有保证, 我更喜欢配置而不是条件编译。

在eclipse中你可以使用多个项目

  • Main(包含通用代码)
  • 版本1(包含版本1代码)
  • 版本2(包含版本2代码)

    1. Main – >选择Project-> Properties-> Java Build Path-> Projects选项卡
    2. 选择添加…
    3. 添加“Version1”xor“Version2”并确定返回工作区。

版本1和版本2包含相同的文件但实现不同。 在Main中你通常会写例如

 import org.mycustom.Version; 

如果您将Version1 / Version2项目作为参考包含在内,它将使用Version1 / Version2项目中的Version.java文件进行编译。