这是一个简化的例子.我有这个枚举声明如下:
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.
所以看起来我们有一个胜利者!谢谢你们的快速回复.
你想要的是一个枚举集
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)