3 回答

TA贡献1821条经验 获得超4个赞
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

TA贡献1807条经验 获得超9个赞
我认为我已经找到了解决方案,它更加简单。
如果我使用“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++; }
添加回答
举报