2014-10-20 66 views
3

我有这样的方法:这是一个真正的警告或过敏皮棉?

private Boolean compare(String property, String relationOperator, 
     String operand) { 
    Integer propertyValue = NumberUtils.toInt(property); 
    Integer operandValue = NumberUtils.toInt(operand); 

    switch (relationOperator) 
    { 
     case "<": return propertyValue.compareTo(operandValue) < 0; 
     case "<=": return propertyValue.compareTo(operandValue) <= 0; 
/*WARN*/case "=": return propertyValue.compareTo(operandValue) == 0; 
     case ">=": return propertyValue.compareTo(operandValue) >= 0; 
     case ">": return propertyValue.compareTo(operandValue) > 0; 
     case "!=": return propertyValue.compareTo(operandValue) != 0; 
    } 
    return Boolean.FALSE; 
} 

对于标/*WARN*/行,FindBugs的3.0.0告诉我:

在 com.foo.MyClass.compare(字符串整数引用的可疑比较,字符串,字符串)[最可怕的(1),高 信心]

我认为的代码是OK,因为我比较int不是Integer s,所以我可以在这条线上安全地@SuppressWarnings

回答

1

您的代码很可怕,因为它使用包装类,并且可以使用包装类时可以使用原语。另外,你的代码太聪明了。你应该尝试write dumb code。喜欢的东西,

private boolean compare(String property, String operator, String operand) { 
    int pv = Integer.parseInt(property); 
    int ov = Integer.parseInt(operand); 
    if (operator.equals("<")) { 
     return pv < ov; 
    } else if (operator.equals("<=")) { 
     return pv <= ov; 
    } else if (operator.equals(">")) { 
     return pv > ov; 
    } else if (operator.equals(">=")) { 
     return pv >= ov; 
    } else if (operator.equals("!=")) { 
     return pv != ov; 
    } else if (operator.equals("=") || operator.equals("==")) { 
     return pv == ov; 
    } 
    return false; 
} 
+1

谢谢,这让警告消失。我最初选择'Integer'来匹配使用'String.compareTo()'的现有代码。 – 2014-10-20 03:21:52

+1

因为Java现在支持切换“String”,所以这里'switch'上的一串'if..else'链没有任何优势。如果需要重构,那么将比较放到枚举中。 – chrylis 2014-10-20 03:32:06

5

由于compareTo返回一个原语int,你是正确的,而且这段代码很好。我建议将此作为针对FindBugs的bug提交。

作为一个说明,你也为你的变量造成不必要的自动装箱。您可以将它们存储在int s中,并使用Integer.compare(propertyValue, operandValue)

0

我认为的代码是OK,因为我比较整形不是整数,所以我可以放心地@SuppressWarnings在这条线?

我想你可以。 (我没有看到你在做什么本质上是不安全的。)

但是,你认为你在比较int s是错误的。

您已经声明propertyValueoperandValue作为Integer,因此compareTo呼叫比较Integer对象。 (尽管这是一种安全的方式...)我很确定是FindBugs抱怨的。

请参阅Elliot Frisch的回答以获得更好的编写代码的方法......这可能更快,而且不会刺激FindBugs。