2011-11-28 76 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所示)來使代碼具有條件性,請使用面向對象的編程:使用設計模式(如策略和依賴注入)來使代碼有條件。