Answers:
private static final boolean enableFast = false;
// ...
if (enableFast) {
// This is removed at compile time
}
上面显示的条件在编译时进行评估。如果相反,您使用此
private static final boolean enableFast = "true".equals(System.getProperty("fast"));
然后,JIT编译器将评估任何依赖enableFast的条件。此开销可忽略不计。
javac
我认为该代码已删除。仅当(say)的表达式enableFast
是编译时常量表达式时,此方法才有效。
private void foo(#ifdef DEBUG DebugClass obj #else ReleaseClass obj #endif )
javac将不会输出无法访问的已编译代码。将最终变量设置为,#define
并将常量设置if
为#ifdef
。
您可以使用javap证明输出类文件中不包含无法访问的代码。例如,考虑以下代码:
public class Test
{
private static final boolean debug = false;
public static void main(String[] args)
{
if (debug)
{
System.out.println("debug was enabled");
}
else
{
System.out.println("debug was not enabled");
}
}
}
javap -c Test
给出以下输出,指示仅在两个路径中的一个被编译(而不是if语句):
public static void main(java.lang.String[]);
Code:
0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3; //String debug was not enabled
5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
我认为我已经找到了解决方案,这要简单得多。
如果我使用“ final”修饰符定义布尔变量,则Java编译器本身即可解决该问题。因为它事先知道测试此条件的结果。例如此代码:
boolean flag1 = true;
boolean flag2 = false;
int j=0;
for(int i=0;i<1000000000;i++){
if(flag1)
if(flag2)
j++;
else
j++;
else
if(flag2)
j++;
else
j++;
}
在我的计算机上运行大约3秒钟。
还有这个
final boolean flag1 = true;
final boolean flag2 = false;
int j=0;
for(int i=0;i<1000000000;i++){
if(flag1)
if(flag2)
j++;
else
j++;
else
if(flag2)
j++;
else
j++;
}
运行大约1秒钟。这段代码需要的时间
int j=0;
for(int i=0;i<1000000000;i++){
j++;
}
从未使用过,但是存在
JCPP是C预处理程序的完整,兼容,独立,纯Java实现。它旨在供使用sablecc,antlr,JLex,CUP等工具用Java编写C风格编译器的人使用。该项目已被用来成功预处理GNU C库的许多源代码。从1.2.5版开始,它还可以预处理Apple Objective C库。
如果您确实需要条件编译并且使用Ant,则可以过滤代码并在其中进行搜索和替换。
例如:http : //weblogs.java.net/blog/schaefa/archive/2005/01/how_to_do_condi.html
例如,您可以通过相同的方式编写过滤器以替换LOG.debug(...);
为/*LOG.debug(...);*/
。这仍然比执行速度更快if (LOG.isDebugEnabled()) { ... }
,更不用说同时简洁了。
如果你使用Maven的,有描述了类似的功能在这里。