20

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

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

4

11 回答 11

17

您可以设置“最终”字段和 ifs 以使编译器优化已编译的字节码。

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

如果在编译代码时“myFinalVar”为假,则“做某事....”位将从编译的类中丢失。如果您有多个条件 - 这可以稍微整理一下:将它们全部转移到另一个类(例如“Config.myFinalVar”),然后条件都可以保存在一个整洁的地方。

这种机制在“Hardcore Java”中有所描述。

[其实我觉得这和之前发的“穷人的ifdef”机制是一样的。]

于 2009-12-17T15:44:27.583 回答
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

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

于 2009-12-18T17:30:59.857 回答
6

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

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
于 2009-12-17T15:45:13.953 回答
6

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

于 2009-12-17T15:50:56.470 回答
4

可以称其为穷人吗ifdefhttp ://www.javapractices.com/topic/TopicAction.do?Id=64 ?

于 2009-12-17T15:35:08.057 回答
3

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

于 2009-12-17T15:32:22.513 回答
1

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

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

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

于 2009-12-17T16:10:54.800 回答
1

您可以结合使用 maven 的资源过滤 mit public static final 字段,这确实会有条件地编译。

private static final int MODE = ${mode};

...

if (MODE == ANDROID) {
    //android specific code here
} else {

}

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

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

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

于 2009-12-17T15:39:41.890 回答
1

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

于 2009-12-17T15:40:03.247 回答
1

有几个项目为 Java 带来了对基于注释的条件编译的支持:

JPSG 中的示例:

/* with Android|Iphone platform */
class AndroidFoo {
  void bar() {
    /* if Android platform */
    doSomething();
    /* elif Iphone platform */
    doSomethingElse();
    /* endif */
  }
}
于 2019-04-08T18:40:37.473 回答
0

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

  • 主要(包含通用代码)
  • 版本 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 文件一起编译。

于 2009-12-17T15:42:30.857 回答