2012-08-10 35 views
1

這是一個簡化的例子。我有這個枚舉聲明如下:有沒有辦法在候選列表中測試枚舉值? (Java)

public enum ELogLevel { 
    None, 
    Debug, 
    Info, 
    Error 
} 

我有這樣的代碼在另一大類:

if ((CLog._logLevel == ELogLevel.Info) || (CLog._logLevel == ELogLevel.Debug) || (CLog._logLevel == ELogLevel.Error)) { 
    System.out.println(formatMessage(message)); 
} 

我的問題是,如果有一種方法可以縮短測試。我非常希望somethign 200英鎊(這是由帕斯卡爾/德爾福借來的):

if (CLog._logLevel in [ELogLevel.Info, ELogLevel.Debug, ELogLevel.Error]) 

而不是比較的一長串。 Java中有這樣的事情,或者可能是實現它的一種方式?我正在使用一個簡單的例子,我的目的是要找出是否有一個模式,所以我可以做更多元素的枚舉值列表進行這些類型的測試。

編輯:它看起來像EnumSet是最接近我想要的東西。實現它用簡單的方式就是通過這樣的:

if (EnumSet.of(ELogLevel.Info, ELogLevel.Debug, ELogLevel.Error).contains(CLog._logLevel)) 

但在標杆,這個執行幅度比的if/then語句,我猜是因爲EnumSet被實例化每次運行時長慢兩個數量級。這個問題只針對運行頻率很高的代碼,即使這樣,它也是一個很小的問題,因爲我們正在談論的是超過100M的迭代,我的盒子上是7ms vs 450ms;兩種方式的時間都非常短。

我在經常運行的代碼中解決的問題是在靜態變量中預先實例化EnumSet,並在循環中使用該實例,該實例在100M迭代中將運行時間減少到更可口的9ms 。

所以看起來我們有一個贏家!謝謝你們的快速回復。

回答

5

你想要的是一個枚舉集

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/EnumSet.html

把你要測試的集合,然後使用Set方法包括()的元素。

import java.util.EnumSet; 


public class EnumSetExample 
{ 
    enum Level { NONE, DEBUG, INFO, ERROR }; 

    public static void main(String[] args) 
    { 
    EnumSet<Level> subset = EnumSet.of(Level.DEBUG, Level.INFO); 

    for(Level currentLevel : EnumSet.allOf(Level.class)) 
    { 
     if (subset.contains(currentLevel)) 
     { 
     System.out.println("we have " + currentLevel.toString()); 
     } 
     else 
     { 
     System.out.println("we don't have " + currentLevel.toString()); 
     } 
    } 
    } 

} 
+0

謝謝,看看我的問題編輯一些使用EnumSet的基準測試,以確保我沒有公司你的表現受到打擊。 –

2

在Java中沒有辦法簡潔地做到這一點。您可以最近的是將值轉儲到一個集合中並調用contains()。在你的情況下EnumSet可能是最有效的。您可以使用雙大括號成語稍微縮短設置的初始化,但是每次使用時都會創建一個新的內部類,因此會稍微增加內存使用量。

+0

謝謝你的回答,你和rcook都碰到了頭,我不得不選擇一個答案,因爲他的分數較少,所以我給了他。 –

1

在一般情況下,日誌記錄級別爲整數實現:

public static int LEVEL_NONE = 0; 
public static int LEVEL_DEBUG = 1; 
public static int LEVEL_INFO = 2; 
public static int LEVEL_ERROR = 3; 

,然後你可以測試嚴重性使用簡單的比較:

if (Clog._loglevel >= LEVEL_DEBUG) { 
    // log 
} 
+0

謝謝,是的,日誌級別只是我想到的一個簡單例子。我真正在做的是更大的枚舉列表。 –

1

你可以使用所需的水平,即列表:

List<ELogLevel> levels = Lists.newArrayList(ELogLevel.Info, 
     ELogLevel.Debug, ELogLevel.Error); 
if (levels.contains(CLog._logLevel)) { 
    // 
} 
+0

'Lists'從哪裏來? –

+0

@BheshGurung,Guava,'com.google.common.collect.Lists' – tenorsax

相關問題