【问题标题】:Implement #ifdef in Java在 Java 中实现#ifdef
【发布时间】:2012-04-01 16:50:15
【问题描述】:
我有一个用 C 编写的算法,它的代码可以由 C 预处理器处理,但由于 java 中没有预处理器,我不知道如何编写 java 代码来处理这样的事情。
C代码是
#ifdef Tile_size_utility
#define print_error 0
else
#define print_error 1
#endif
如何在 Java 中实现这个?
【问题讨论】:
标签:
java
conditional-compilation
【解决方案1】:
你不能。
但是,Java 确实具有继承和多态性。您可以利用这些概念以及依赖注入模式以更简洁但不同的方式解决问题。
如果您发布有关 print_error 作用的详细信息,我可以给您更准确的答案。
【解决方案2】:
我们无法将其翻译成 Java。我们必须分析,在哪里设置了属性 (Tile_size_utility) 以及我们需要在哪里设置print_error。然后我们可以实现一个等效的解决方案。
示例:假设 Tile_size_utility 是系统属性(在环境中设置),我们需要 PRINT_ERROR 作为(布尔)标志,那么这应该可以:
public class MyClass {
public final static boolean PRINT_ERROR =
(System.getProperty("Tile_size_utility") != null);
}
现在如果你做一些set Tile_size_utility=myutiliy 或者用参数启动java
-DTile_size_utility=myutiliy
那么PRINT_ERROR 将被设置为true。
【解决方案3】:
Class ErrorVerbose {
private static boolean enabled = False;
public static setEnable(boolean enable)
enabled = enable;
}
public static perror(String msg) {
if (enabled) {
/* Print */
}
}
}
class YourClass {
public YourClass(....,boolean status) {
ErrorVerbose.SetEnable(status)
.
.
}
}
好吧,是的,您可以制作一个非静态类,以便其他类可以启用/禁用详细信息。制作 ErrorVerbose 类的优点是您可以添加更多信息,例如时间、日期、函数名称(调用的)等,这使得它更具信息性,我刚刚给出了一个骨架。
【解决方案4】:
使用以下方法构建定义管理器:
abstract public class DefineManager {
abstract public boolean isDefined(String k);
abstract public String getDefine(String k);
abstract public void setDefine(String k, String v);
abstract public void undefine(String k);
}
if (isDefined("Tile_size_utility")) {
setDefine("print_error", "0");
}
else {
setDefine("print_error", "1");
}
【解决方案5】:
JVM 将代码动态编译为原生代码,因此可以在运行时更改这些设置并获得大致相同的性能。
您可能会发现 C++ 支持的许多技巧在 Java 中是不需要的,因为它有其他问题的解决方案留给 JVM。与其他语言相比,Java 的功能往往很差,但它所拥有的功能已经过大量优化,这可能会让一些开发人员感到惊讶。