2012-08-10 24 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

相关问题