java - 如何检查参数值是否在常量列表中

标签 java performance list enums

我有一个常量列表,想检查传递给方法的值是否等于其中一个常量。我知道枚举很好,但出于性能原因,我在这里需要一个 int 值。枚举值可以有值,但恐怕获取 int 值比直接使用 int 慢。

public static final int 
  a = Integer.parseInt("1"), // parseInt is necessary in my application
  b = Integer.parseInt("2"), 
  c = Integer.parseInt("3");

public void doIt(int param) {
  checkIfDefined(param);
  ...
}

问题是关于 checkIfDefined 的。我可以使用 if:

if(param == a)
  return;
if(param == b)
  return;
if(param == c)
  return
throw new IllegalArgumentException("not defined");

或者我可以使用 Arrays.binarySearch(int[] a, int key),或者……还有更好的主意吗?

也许枚举不仅在优雅方面而且在速度方面都更好,因为我不需要运行时检查。

解决方案

由于无论是 enum 还是 switch 在我使用 parseInt 的特殊情况下都有效,所以我将普通的旧 int 常量与 数组一起使用。二进制搜索 现在。

最佳答案

你更喜欢使用枚举吗:

public enum Letters {
    A("1"), B("2"), C("3");

    private final String value;

    private Letters(String value) {
        this.value = value;
    }

    public Letters getByValue(String value) {
        for (Letters letter : values()) {
            if (letter.value.equals(value)) return letter;
        }
        throw new IllegalArgumentException("Letter #" + value + " doesn't exist");
    }

    public int toInt() {
        return Integer.parseInt(value);
    }
}

关于java - 如何检查参数值是否在常量列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2311469/

相关文章:

java - 测试包含模拟 JPA 存储库的服务时出现 NullPointerException

java - 为什么在 Java 中允许将 double 转换为 char?

java - 使用正则表达式模式获取两个表达式之间的所有子字符串(JAVA)

java - GSON 无法转换通用 <T> 属性

javascript - 为什么 node.js 比 Google Chrome 慢得多?

linux - block 文件写入的优点是什么

c# - 在 C# 中存储/检索字典的最有效方法?

java - 在 Java 8 中使用 lambda 表达式时出现错误的非法开头

Python - 同时遍历两个列表而不在每次迭代中都移动到下一行

python - 用 Python 解析 XML 文件并在每个列表元素中获取字母 'u'