【发布时间】:2012-12-11 12:32:06
【问题描述】:
我经常遇到一种验证模式,在这种模式下,为了有效,一些变量必须包含前缀数量的值之一。
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 术语链是否可以提高性能也许还有代码可读性。
【问题讨论】:
-
我觉得这个风格很好。就性能而言,在我根据典型数据分析应用程序之前,我不会尝试优化任何东西。
-
+1 表示 NPE。永远不要假设你的性能瓶颈在哪里,也永远不要过早地优化
-
是的,这是真的。还有一个替代方案,EnumSet,它被实现为位集操作。虽然它可能无法用作就地替代品,但可能需要更改 API。
-
注意: 将字符串与
==进行比较在大多数情况下都是错误的。在大多数情况下,您必须使用aString.equals(otherString)。 stackoverflow.com/questions/767372/java-string-equals-versus -
为什么不是哈希图,因为常量是键值对?
标签: java coding-style