2012-07-25 98 views
1

我有C++背景。某處在我的Java項目的中間我需要定義一個變量,其類型取決於一個布爾值(這是我早先定義) 我可以這樣做:在缺少#ifdef預處理器的情況下定義變量

if(Main.NEW_STYLE) 
      ArrayList<LogFileLine> lineBuffer = new ArrayList<LogFileLine>(); 
     else 
      ArrayList<String> lineBuffer = new ArrayList<String>(); 

如果沒有,該如何解決,請? 謝謝

回答

0

我建議您創建一個接口,用於捕獲StringLogFileLine所依賴的方法。說它LogLine什麼的,這是由兩個不同的類,StringLogLineFileLogLine實施,然後做

List<LogStyle> lineBuffer = new ArrayList<LogLine>(); 
1

可以使用原始類型(只是ArrayList),但我強烈勸阻,作爲原料類型只存在於與預先通用代碼的向後兼容性。

適當的解決方案可能是將該列表封裝到一個接口中,並有兩個單獨的實現類(並根據布爾值選擇實現類)。

0

Java沒有編譯器預處理器。

我相信你正在嘗試在本聲明結尾處有一個ArrayList。因此,這裏是你應該怎麼做:

ArrayList lineBuffer; 
if (...) 
    lineBuffer = new ArrayList<String>(); 
else 
    lineBuffer = new ArrayList<LogFileLine>(); 

lineBuffer.add(something); 

然而add可能導致運行時的問題,那麼爲什麼你不只是做

ArrayList lineBuffer = new ArrayList<Object>()

,基本上可以將你的東西?

+2

這是使用原始類型('ArrayList'),這幾乎總是一個壞主意(除了當你需要它的向後兼容性)。 – 2012-07-25 08:44:11

1

你可以做到這一點,但它不會幫助你很多。因爲那些ArrayList的範圍是if語句的主體。

你可以做到以下幾點:

ArrayList<Object> lineBuffer; 
if(Main.NEW_STYLE) lineBuffer = new ArrayList<LogFileLine>(); 
else lineBuffer = new ArrayList<String>(); 

,然後相應地投你的對象。另一種方法是創建一個容器接口,那麼這將是你的ArrayList類型:

ArrayList<LogInterface> lineBuffer = new ArrayList<LogInterface>(); 
lineBuffer.add(new LogInterface_LogFileLine(aLogFileLine)); 
lineBuffer.add(new LogInterface_String("lalelu")); 

你會然後實現LogInterface,一個拿着StringLogInterface_String)兩個版本,另外一個拿着一個LogFileLineLogInterface_LogFileLine)。

但是,既然你命名了你的布爾值NEW_STYLE,我想它會在完全替換掉舊的風格的時候出現,所以我建議從我這裏做第一個建議。您必須在您訪問您的lineBuffer的任何地方都要這樣做if (Main.NEW_STYLE) ; else ;。但是,一旦你不再需要它,將老東西踢出去會容易得多。