2011-11-28 77 views
21

我想知道是否有如果Java相当于对C的如何标记的Java代码,例如,它不是编译

#if 0 
... Some Code ... 
#endif 

可以围绕我们不希望编译代码块中。添加块报价:

/* 
... Some Code ... 
*/ 

也有同样的效果,但问题是,我们必须确保没有单独的一行中块注释

// some comment 

+2

为什么你必须确保没有''//评论? - 块注释内的'//'仍然是合法的语法。也没有,这就是块注释是 – tobyodavies

+0

对于第二部分,如果我理解正确这个原因,你应该使用'#如果0 ...'在C. - 不能块引号用于单行注释? –

+1

相关:http://stackoverflow.com/questions/4526113/java-conditional-compilation-how-to-prevent-code-chunks-to-be-compiled – Thilo

回答

8

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

2

我甚至无法想象为什么这是一个问题(如上所述),但我怀疑最简单的做法是在编译代码之前在代码中进行grep(或将其提交给版本控制回购)。我不认为有黯然失色任何东西(如果这是你使用的是什么),以帮助你,我几乎可以肯定的是Java已经没有内置的像一个机制,你在C.

描述
1

我看到这在某个地方前一段时间:

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

而且您可以将// s放入,并根据需要将其删除。不过,这可能是多行评论,如果他们在那里会导致问题。

4

有几种解决方案:

  1. 使用预处理 - 我认为它会与标准CPP工作。有一些Java特定proprocessors为jappo和java+,你可以尝试

  2. 与更换0#如果真要是:

    如果(假){ 代码 }

的可以通过查询系统属性来改进条件:

if(System.getProperty("NO_COMPILE").equals("true")) { 
    code 
    } 

这样做的好处是:在它可以很容易地从ANT或从Eclipse设置。

编辑:请注意,代码是否会实际编译并存在于.class文件中。此外,虽然查询系统性能更优雅,是在运行时完成在编译时间,因此不太内嵌原始需求。如果(错误的)在第二次更好。

EDIT2:一个更好的解决方案,我刚才发现:http://prebop.sourceforge.net/

+0

把它放在一个if(false)块在eclipse中不起作用。例如下面给出的是编译器错误(我有Project-> Build Automatically“ON”):if(false){intentional;}这意味着它正在被编译。 –

+0

没错 - 这就是我在第一次编辑时所说的。即使使用static final的解决方案也会编译代码。 Eclipse不应该给出错误,而是警告你“死代码”。如果你有错误,那么它在if(false)守护的块中可能是错误的 –

23

static final字段可以使用条件编译。

static final boolean DEBUG = false; 

if (DEBUG) { 
    some code .... 
} 

some code将被编译器移除。

另外,也可以使用assert关键字来启用和禁用代码的某些部分。使用java -ea: ..来控制应该启用还是禁用代码。见http://docs.oracle.com/javase/1.5.0/docs/guide/language/assert.html

+0

这只有在静态final是布尔值时才起作用?将使用'DEBUG'作为整数工作吗? – Pacerier

+1

@Pacerier否,它也适用于'static final int's,但不是'enum's。我检查了反编译器,枚举保持原样,但是,'int's可以引用其他最终的'int's。另外'开关case'用'int's不做魔术 - 即,普通'如果...否则,如果...'梯子 这应该是答案! – zeropoint

+0

@zeropoint,但是规范保证这确实是编译时? – Pacerier

1

如果(假)很适合我(使用Eclipse)。

+3

你可以给一个参数*为什么*这不是编译? – alestanis

+0

AFAIK,这是编译。所以你不能在'if'块中存在代码错误。我试过'static final boolean DONT_COMPILE = false',然后使用'if(!DONT_COMPILE){}'。这仍然会编译'if'块中的代码。 –

-1

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