如何标记java代码,使其';它没有被编译

如何标记java代码,使其';它没有被编译,java,Java,我想知道是否有C语言的Java等价物 #if 0 ... Some Code ... #endif 可以在我们不想编译的代码块周围使用。添加块引号: /* ... Some Code ... */ 也有同样的效果,但问题是,我们必须确保没有单行评论 // some comment 在街区里 Java中没有预处理器指令。最好的选择是注释掉代码。我甚至无法想象这是一个问题的原因(如上所述),但我认为最简单的方法是在编译代码(或将其提交到版本控制报告)之前对代码中的//进行grep。我认为ecl

我想知道是否有C语言的Java等价物

#if 0
... Some Code ...
#endif
可以在我们不想编译的代码块周围使用。添加块引号:

/*
... Some Code ...
*/
也有同样的效果,但问题是,我们必须确保没有单行评论

// some comment

在街区里

Java中没有预处理器指令。最好的选择是注释掉代码。

我甚至无法想象这是一个问题的原因(如上所述),但我认为最简单的方法是在编译代码(或将其提交到版本控制报告)之前对代码中的//进行grep。我认为eclipse中没有任何东西(如果您正在使用的话)可以帮助您,而且我几乎可以肯定java没有像您在C中描述的那样的内置机制。

我刚才在某处看到了这一点:

// /*
class SomeClass{
     int withSomeField;
     ..............
}
// */

您可以将
/
放入并根据需要移除它们。不过,如果多行注释在其中,可能会导致问题。

有几种解决方案:

  • 使用预处理器-我认为它将与标准CPP一起工作。有一些特定于Java的前处理器,如jappo,您可以试试

  • 将#if 0替换为true if:

    if(false){ 代码 }

  • 可以通过查询系统属性来细化条件:

     if(System.getProperty("NO_COMPILE").equals("true")) {
        code
      } 
    
    这有一个优点,即可以从ANT或Eclipse轻松设置

    编辑:请注意,如果代码将实际编译并显示在.class文件中,请使用。此外,尽管查询系统属性更加优雅,但它是在运行时而不是在编译时完成的,因此并不完全符合原始需求。if(false)处于第二位


    EDIT2:我刚刚找到了一个更好的解决方案:

    在C/C++语言中没有与预处理器指令相当的Java版本。 无论如何,您可以使用注释或ANT来做类似的事情,正如这里简要解释的那样

    还是在这里


    静态最终
    字段可用于条件编译

    static final boolean DEBUG = false;
    
    if (DEBUG) {
      some code ....
    }
    
    编译器将删除一些代码


    还可以使用
    assert
    关键字启用和禁用部分代码。使用
    java-ea:..
    控制是启用还是禁用代码。请参阅(false)是否适合我(使用Eclipse)。

    您可以使用Java预处理器,我想这将是一种比flags更好的方法
    标记当然允许在编译阶段剪切和添加块,但预处理器允许使过程更加灵活

    而不是试图通过预处理源代码(如C)使代码有条件,使用面向对象编程:使用设计模式,如策略和依赖项注入,使代码有条件。

    为什么必须确保没有
    /
    注释?--块注释中的
    /
    仍然是合法语法。此外,没有理由在C中使用
    #if 0…
    。这就是第二部分的块注释,如果我理解正确的话-块引号不能用于单行注释吗?相关:抱歉,我似乎弄错了。我们不必这样做,将它放在if(false)块中在eclipse中不起作用。例如,下面给出的是编译器错误(我有Project->buildautomatically“ON”):if(false){intential;},这意味着它正在被编译。即使是带有静态final的解决方案也会编译代码。Eclipse不应该给出错误,但应该警告您“死代码”。如果您有错误,那么它可能是由If(false)保护的块中的某个错误。您能给出一个关于为什么不编译它的参数吗?好的,这是编译的。因此,在
    if
    块中不能有代码错误。我尝试了
    静态最终布尔DONT_COMPILE=false
    ,然后使用
    if(!DONT_COMPILE){}
    。这仍然编译
    if
    块中的代码。这是否仅在静态final为布尔值时才起作用?使用
    DEBUG
    作为整数是否有效?@Pacerier否它也适用于
    static final int
    s,但不适用于
    enum
    s。我用反编译器检查过,枚举保持原样,但是是的,
    int
    s可以引用其他final
    int
    s。另外,使用
    int
    s的
    switch case
    不要做魔术-也就是说,普通
    if…else if…
    梯子这应该是答案@然而,规范是否保证这确实是编译时?只是检查它是否改变了实际的字节码。是的,如果语句总是错误的,if中的整个部分都会丢失。if中的整个部分都会丢失,if子句也会被删除,对吗?