这是一个简化的例子。我有这个枚举声明如下:
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));
}
我的问题是是否有办法缩短考试时间。理想情况下,我想要一些调子(这是从 Pascal/Delphi 借来的):
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 和 450ms;无论哪种方式,时间都很短。
对于经常运行的代码,我选择的是在静态变量中预先实例化 EnumSet,并在循环中使用该实例,这会将运行时间缩短到 100M 迭代中更可口的 9ms。
所以看起来我们有一个赢家!谢谢你们的快速回复。