有没有办法在候选人列表中测试枚举值?(JAVA)

Gab*_*ana 1 java

这是一个简化的例子.我有这个枚举声明如下:

public enum ELogLevel {
    None,
    Debug,
    Info,
    Error
}
Run Code Online (Sandbox Code Playgroud)

我在另一个类中有这个代码:

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

我的问题是,是否有办法缩短测试时间.理想情况下,我想要一些调整(这是从Pascal/Delphi借来的):

if (CLog._logLevel in [ELogLevel.Info, ELogLevel.Debug, ELogLevel.Error])
Run Code Online (Sandbox Code Playgroud)

而不是长长的比较列表.Java中有这样的东西,或者可能是实现它的方法吗?我正在使用一个简单的例子,我的目的是找出是否有一个模式,所以我可以使用更多元素的枚举值列表进行这些类型的测试.

编辑:看起来EnumSet是最接近我想要的东西.Naïve实现它的方式是通过以下方式:

if (EnumSet.of(ELogLevel.Info, ELogLevel.Debug, ELogLevel.Error).contains(CLog._logLevel))
Run Code Online (Sandbox Code Playgroud)

但是在基准测试中,这比long if/then语句要慢两个数量级,我猜是因为EnumSet每次运行都会被实例化.这只是经常运行的代码的一个问题,即使这样,这也是一个非常小的问题,因为超过100M的迭代我们在谈论我的盒子上的7毫秒对450毫秒; 两种方式都是非常短的时间.

对于经常运行的代码,我选择的是在静态变量中预先实例化EnumSet,并在循环中使用该实例,这将运行时间缩减到比100M迭代更可口的9ms.

所以看起来我们有一个胜利者!谢谢你们的快速回复.

arc*_*rcy 5

你想要的是一个枚举集

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

将要测试的元素放入集合中,然后使用Set方法contains().

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());
      }
    }
  }

}
Run Code Online (Sandbox Code Playgroud)