Java If(false)编译

Java If(false)编译,java,tomcat,Java,Tomcat,我正在使用Tomcat开发一个动态web项目。有一个全局标志是很有用的,这是我在开发和部署服务器之间唯一需要更改的东西。该标志的最大用途是打印语句 public class Debug { public final static boolean DEVEL = true; public static void print(String message){ if(DEVEL){ System.out.println(messa

我正在使用Tomcat开发一个动态web项目。有一个全局标志是很有用的,这是我在开发和部署服务器之间唯一需要更改的东西。该标志的最大用途是打印语句

public class Debug {
    public final static boolean DEVEL = true;        
    public static void print(String message){
        if(DEVEL){
            System.out.println(message);
        }
    }
}
我的问题是,java会编译出打印语句吗。i、 e.如果devel标记为false,则消息显然不会打印,但会包含在类文件中(devel为final)。这是一个效率问题。我听说java编译器非常聪明,但它会接受这一点。

使用“final”属性(正如您所做的那样),它会编译出代码:

public static final boolean DEVEL=false


您可以通过对结果类文件进行灰显来检查是否存在仅在编译代码时才会出现的字符串。

查看本文:

您提供的代码称为“死代码”,因此,如果将DEVEL设置为false,它将不会包含在编译的类文件中,也不会包含在字节码中

另外,请检查命令

javap -c

要查看类的结果字节码。

如果不想让编译器编译出来,请使用以下命令:

    public final static boolean DEVEL = Math.random() > -1;
编译器不会知道这总是
true
。(当然使用
<-1
表示
false

当您想暂时删除代码而不让编译器抱怨死掉的代码时,我发现这个技巧非常有用,例如:

void myMethod() {
    // temporarily exit early
    if (Math.random() > -1) return;
    // usual code
}

我从未见过编译器删除这样的代码,但是JIT将有效地删除从未运行过的代码。断言是这方面的常见用例。可能仍然存在名义成本,但通常不值得担心。i、 e.小于1纳秒。

如果消息的toString()方法成本较高,则成本可能会更高。预处理语句中的大型sql查询的toString方法由于此行而导致堆溢出。因此,标准没有删除它

把这些陈述汇编出来有多重要?即使它们没有被编译出来,检查布尔变量的值也非常便宜(比调用调试类本身的print方法便宜…)这可能是我希望/想要的。谢谢哎呀!“它将编译出代码”这句话在我拙劣的经验中始终是正确的,但是(和搜索
if(DEBUG){x=3;}
)明确指出,这种优化是可选的,将此决定留给编译器实现者。。。所以不要依赖于它的正确性。。。除此之外,它使naf完全不同。过早的优化是邪恶的。@corlettk-oops是正确的。。。我通常在我的断言上更谨慎,但有时我会得意忘形。我应该把“以我的经验……”作为限定词。谢谢让它成为非最终版本不是更容易吗?
final
可能有助于运行时优化器。更简单的方法是
Boolean-DEVEL=Boolean.TRUE
if(Boolean.TRUE)
。(但为什么需要将死代码保存在类文件中?)我不明白这有什么意义<代码>如果(真)返回编译,即使有以下代码。我一直都是这样做的。@EJP只是因为我在IDE中看到了“无法访问的代码”警告-这种方法会使它们消失。关闭这些警告也是如此。没有理由为
javap-c
提示编写不可理解的代码IMHO.+1。。。这是一种肯定的方式,您的java编译器已经实现了这个可选的优化。。。而且我仍然认为(除了最“极端”的情况外)这一点无论如何都是沉默的。。。每次迭代只有一条指令。当然,我们还有更好的事情要考虑吗?;-)干杯Keith@corlettk-不仅如此,即使它在字节码中,如果代码是JIT编译的,那么jvm也不会消除它。大多数优化都会在之后运行死代码消除。@cc:我没有想到JIT优化,如果此语句位于“热点”位置,它就会启动。去证明这样的微观选择几乎在所有方面都是毫无意义的。@corlettk:当然-在这种情况下。当你在为移动平台开发时,如果你可能没有JIT,那么了解这一点仍然很好:)这是真的。我想,在开发wee移动处理器(或至少是这一代处理器)时,人们必须(像过去的好时光一样)注意效率。。。但请记住摩尔在手机上玩过burko。。。巴克的收入大约每两年翻一番,而不是三年翻一番。