如何标记java代码,使其';它没有被编译
我想知道是否有C语言的Java等价物如何标记java代码,使其';它没有被编译,java,Java,我想知道是否有C语言的Java等价物 #if 0 ... Some Code ... #endif 可以在我们不想编译的代码块周围使用。添加块引号: /* ... Some Code ... */ 也有同样的效果,但问题是,我们必须确保没有单行评论 // some comment 在街区里 Java中没有预处理器指令。最好的选择是注释掉代码。我甚至无法想象这是一个问题的原因(如上所述),但我认为最简单的方法是在编译代码(或将其提交到版本控制报告)之前对代码中的//进行grep。我认为ecl
#if 0
... Some Code ...
#endif
可以在我们不想编译的代码块周围使用。添加块引号:
/*
... Some Code ...
*/
也有同样的效果,但问题是,我们必须确保没有单行评论
// some comment
在街区里 Java中没有预处理器指令。最好的选择是注释掉代码。我甚至无法想象这是一个问题的原因(如上所述),但我认为最简单的方法是在编译代码(或将其提交到版本控制报告)之前对代码中的//进行grep。我认为eclipse中没有任何东西(如果您正在使用的话)可以帮助您,而且我几乎可以肯定java没有像您在C中描述的那样的内置机制。我刚才在某处看到了这一点:
// /*
class SomeClass{
int withSomeField;
..............
}
// */
您可以将
/
放入并根据需要移除它们。不过,如果多行注释在其中,可能会导致问题。有几种解决方案:
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可以引用其他finalint
s。另外,使用int
s的switch case
不要做魔术-也就是说,普通if…else if…
梯子这应该是答案@然而,规范是否保证这确实是编译时?只是检查它是否改变了实际的字节码。是的,如果语句总是错误的,if中的整个部分都会丢失。if中的整个部分都会丢失,if子句也会被删除,对吗?