java - 使用 static final unmodifiable Set as constant 来检查变量值

标签 java coding-style

我经常运行一种验证模式,在这种模式中,某些变量必须包含前缀数量的值之一才能有效。

PSEUDO CODE:
    IF x == CONSTANT_1 || X == CONSTANT_2 || ... || x == CONSTANT_N
    THEN X is valid

为了避免 OR 项链,我创建了一个静态最终不可修改集,其中包含所有常量:

public final static String CONSTANT_1 = *value* ;
public final static String CONSTANT_2 = *value* ;
...
public final static String CONSTANT_N = *value* ;

public final static Set SET_OF_CONSTANTS = Collections.unmodifiableSet(new HashSet(){
    private static final long serialVersionUID = 1L;
    {
        add(CONSTANT_1); 
        add(CONSTANT_2);
        ...
        add(CONSTANT_3);
    }
});

然后我按以下方式执行检查:

if(!SET_OF_CONSTANTS.contains(x)){ 
    //X NOT VALID 
}

我想知道这是否是一个好的编程实践,是否有任何替代方案,以及使用哈希表查询(理论上 O(1))而不是 OR 术语链是否确实可以提高性能或许还有代码可读性。

最佳答案

总的来说,我认为这是一种非常好的风格。

没有太大区别,但我个人会这样定义 SET_OF_CONSTANTS:

      public final static String CONSTANT_1 = "*value*";
      public final static String CONSTANT_2 = "*value*";
              ...
      public final static String CONSTANT_N = "*value*";

      public final static Set<String> SET_OF_CONSTANTS = Collections.unmodifiableSet(
        new HashSet<String>(Arrays.asList(
              CONSTANT_1, 
              CONSTANT_2,
                      ...
              CONSTANT_N
              )));

我不完全清楚您是否需要单独的 CONSTANT_1 常量,或者您是否可以简单地将这些值折叠到 SET_OF_CONSTANTS 中。

就性能而言,在我根据真实数据分析代码之前,我不会开始优化任何东西。

最后请注意,当x 是一个字符串时,以下可能是不正确的:

IF x == CONSTANT_1 || x == CONSTANT_2 || ... || x == CONSTANT_N

在这里,== 可能应该替换为对 equals() 的调用。

关于java - 使用 static final unmodifiable Set as constant 来检查变量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13820519/

相关文章:

java - Java 和 C++ 的编码风格之间有什么具体区别?

java - Spring MVC 和 jquery post 请求与 POJO 数组

Java 从一个单独的方法返回一个变量

java - 如何从 firebase 检索数据并输入到 csv

java - 如何检查某个用户在根节点上是否具有{写、读}权限

sql - LINQ 查询 : SQL-style abbreviations or spell it out?

c++ - 使用数据库模型(键)来引用运行时对象,好主意还是坏主意?

c# - ObserveOn 与修改代码以在主线程上运行

.net - 在大型 .NET 代码库中,评论真的被普遍认为是邪恶的吗?

java - 枚举类的内部(扩展)版本